Android. Défilement 2 listviews ensemble
OK. Ce que je suis en train de réaliser une mise en page qui fait le même effet que des volets figés dans Excel. Qui est je veux une ligne d'en-tête qui permet de faire défiler horizontalement avec les principaux ListView et une main gauche ListView qui défile verticalement avec les principaux ListView. La ligne d'en-tête et de la main gauche listview doit rester à l'arrêt lors du défilement dans l'autre dimension.
Ici est la mise en page xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/recordViewLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<LinearLayout android:layout_width="160dp"
android:layout_height="match_parent"
android:orientation="vertical">
<CheckBox
android:id="@+id/checkBoxTop"
android:text="Check All"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ListView android:id="@+id/engNameList"
android:layout_width="160dp"
android:layout_height="wrap_content"/>
</LinearLayout>
<HorizontalScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout android:id="@+id/scroll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<include layout="@layout/record_view_line" android:id="@+id/titleLine" />
<ListView
android:id="@android:id/list"
android:layout_height="wrap_content"
android:layout_width="match_parent"/>
</LinearLayout>
</HorizontalScrollView>
</LinearLayout>
Je suis alors à l'aide de ce code dans le ListActivity
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
View v = recordsListView.getChildAt(0);
int top = (v == null) ? 0 : v.getTop();
((ListView)findViewById(R.id.engNameList)).setSelectionFromTop(firstVisibleItem, top);
}
Ce qui devrait entraîner la main gauche ListView pour faire défiler quand la main droite un défile à l'écran par l'utilisateur. Malheureusement, cela ne marche pas.
J'ai eu un peu de google et il semble que le setSelectionFromTop() ne fonctionnera pas sur une liste qui est imbriquée à l'intérieur plus d'une mise en page.
Si c'est le cas, quelqu'un peut-il suggérer une manière de les faire défiler ensemble ou une autre façon de définir la mise en page ou à une autre technique tout à fait.
- Avez-vous essayé smootHSCrollToPosition: developer.android.com/reference/android/widget/...
- Merci pour la réponse rapide. Cependant, ce n'est pas la solution. Je suis à la recherche pour obtenir les listviews pour faire défiler bien ensemble.
- vous avez la solution d'un même problème, je suis confronté.
Vous devez vous connecter pour publier un commentaire.
Réécrire
Je n'ai pas eu beaucoup de chance avec le passage de la vitesse de défilement des actions dans un ListView à l'autre. J'ai donc choisi une méthode différente: en passant la
MotionEvent
. Cela permet à chaqueListView
calculer leur propre lisse de défilement, défilement rapide, ou quoi que ce soit d'autre.D'abord, nous allons avoir besoin de quelques variables de classe:
De chaque méthode que j'ajoute à
listView
sera pratiquement identique pourlistView2
, la seule différence est quelistView2
référencelistView
(pas en lui-même). Je ne comprend pas la répétitiflistView2
code.Deuxième, commençons par le OnTouchListener:
Pour prévenir la logique circulaire:
listView
appelslistView2
appelslistView
appels... j'ai utilisé une variable de classetouchSource
pour déterminer quand uneMotionEvent
doit être passée. Je suppose que vous ne voulez pas d'une ligne, cliquez danslistView
de cliquer aussi sur danslistView2
, j'ai donc utilisé une autre variable de classeclickSource
pour l'en empêcher.Troisième, la OnItemClickListener:
Quatrième, passer chaque événement tactile n'est pas parfait à cause occasionnelle des divergences apparaissent. Le OnScrollListener est parfait pour l'élimination de ces:
(Facultatif) Enfin, vous avez mentionné que vous avez de la difficulté depuis
listView
etlistView2
commencer à différentes hauteurs dans votre mise en page... je très vous recommandons de modifier votre mise en page à l'équilibre, les ListViews, mais j'ai trouvé un moyen d'y remédier. Cependant, il est un peu difficile.Vous ne pouvez pas calculer la différence de hauteur entre les deux mises en page jusqu'à ce que après toute la mise en page ont été rendus, mais il n'y a pas de rappel pour ce moment... donc j'utilise un simple gestionnaire:
Je assumer que d'une demi-seconde de retard est assez longue pour rendre la mise en page et démarrer le minuteur en
onResume()
:Si vous utilisez un décalage, je tiens à être clair
listView2
's OnScroll méthode de la soustraction de l'offset plutôt que de ajoute:Espère que ça aide!
isFocused()
ne se comportent pas de la façon que j'ai d'abord pensé donc j'ai changé de tactique. Espérons que cette aide.MotionEvent.ACTION_CANCEL
OK. J'ai une réponse maintenant. Le problème étant que .setSelectionFromTop() ne fonctionne que si la liste était dans le haut de page (ie. pas imbriquée). Des Afters certains casse-tête, j'ai réalisé que je pouvais faire ma mise en page d'un RelativeLayout et obtenir le même look, mais sans avoir à nid disposition de la case et de la listview. C'est la nouvelle mise en page:
Fondamentalement, c'est le code qui va avec la mise en page.
Dans onCreate()
et les méthodes d'écoute:
Ce fil m'a aidé à trouver une solution à un problème similaire, j'ai eu du mal avec pendant un certain temps. Elle est aussi basée sur l'interception des événements tactiles. Dans ce cas, la synchronisation fonctionne pour plusieurs listviews et est entièrement symétrique.
Le principal défi était de prévenir élément de la liste de clics pour propager aux autres listviews. J'ai besoin de clics et de longue clics distribué uniquement par la listview qui a initialement reçu l'événement de touche, y compris, en particulier, le point culminant de la rétroaction lorsque vous touchez un élément (interception d'événement onClick n'est d'aucune utilité puisqu'il est trop tard dans l'appel de la hiérarchie).
La clé, c'est d'intercepter la touche deux fois. Tout d'abord, la première touche de l'événement est relayé à l'autre listviews. La même onTouch fonction de gestionnaire de captures de ces et les nourrit à un GestureDetector. Dans le
GestureDetector
rappels de statique des événements tactiles (onDown
etc.) sont consommés (return true
) alors que le mouvement gestes ne sont pas (return false
), de sorte qu'ils puissent encore être distribué par la vue elle-même et de déclencher le défilement.À l'aide de
setPositionFromTop
à l'intérieur deonScroll
ne fonctionne pas pour moi, car il rend le comportement de défilement extrêmement lent. OnScroll est utilisé au lieu d'aligner initiale de défilement des positions en tant que nouveau ListViews sont ajoutés à la Syncer.Le seul problème qui persiste à ce jour est celui qui a été mis en place par s1ni5t3r ci-dessus. Si vous double-fling la liste alors qu'ils continuent d'être déconnecté.
edit: le double-fling problème peut être résolu en utilisant une variable d'état.
- Je le résoudre en changeant ListView RecyclerView , utilisez RecyclerView .addOnScrollListener pour synchroniser le défilement de l'événement. Et il n'y a pas de différences,c'est parfait!
Selon Sam instructions, j'ai développé une application simple montrant le défilement à deux listviews ensemble. En fait mon but principal est de créer un défilement horizontal extensible listview
fixe/congelés colonnes et de travail sur lorsque vous avez terminé, partagez bientôt
https://github.com/huseyinDaVinci/Android/tree/master/FrozenListViews
Essayer ci-Dessous la solution, il fonctionne dans mon cas
SyncedScrollListener.java