Desplazamiento de ListViews juntos

Tengo dos objetos ListView que me gustaría desplazar juntos. Están lado a lado, así que si uno se desplaza una cierta cantidad, el otro se desplaza esa misma cantidad. He encontrado algunos ejemplos sobre cómo hacer esto, pero creo que se basan en los elementos de ListView son de la misma altura (corregirme si estoy equivocado). Los elementos de uno de mis objetos ListView son más altos que los de la otra, abarcando 2-3 elementos.

¿Cómo puedo "bloquear" estos 2 objetos ListView juntos?

EDIT: Aquí hay una captura de pantalla de lo que tengo, tal vez será mejor explicar lo que estoy buscando. El lado izquierdo (rojo) es una lista de elementos y el lado derecho es una lista separada. Puede ver cómo las listas no se alinean perfectamente, por lo que no es exactamente una cuadrícula. Lo que me gustaría hacer es tener este acto como una lista grande, donde el desplazamiento de cualquiera de las listas también se desplazará el otro.

Screenshot de la aplicación

Creé una clase áspera que hace básicamente lo que quería hacer. No es lo suficientemente inteligente como para manejar si la segunda lista es más larga que la primera o si la orientación cambia, pero es lo suficientemente bueno como para bajar el concepto.

Para configurarlo:

 list1.setOnScrollListener(new SyncedScrollListener(list2)); list2.setOnScrollListener(new SyncedScrollListener(list1)); 

SyncedScrollListener.java

 package com.xorbix.util; import android.view.View; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; public class SyncedScrollListener implements OnScrollListener{ int offset; int oldVisibleItem = -1; int currentHeight; int prevHeight; private View mSyncedView; public SyncedScrollListener(View syncedView){ if(syncedView == null){ throw new IllegalArgumentException("syncedView is null"); } mSyncedView = syncedView; } public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { int[] location = new int[2]; if(visibleItemCount == 0){ return; } if(oldVisibleItem != firstVisibleItem){ if(oldVisibleItem < firstVisibleItem){ prevHeight = currentHeight; currentHeight = view.getChildAt(0).getHeight(); offset += prevHeight; }else{ currentHeight = view.getChildAt(0).getHeight(); View prevView; if((prevView = view.getChildAt(firstVisibleItem - 1)) != null){ prevHeight = prevView.getHeight(); }else{ prevHeight = 0; } offset -= currentHeight; } oldVisibleItem = firstVisibleItem; } view.getLocationOnScreen(location); int listContainerPosition = location[1]; view.getChildAt(0).getLocationOnScreen(location); int currentLocation = location[1]; int blah = listContainerPosition - currentLocation + offset; mSyncedView.scrollTo(0, blah); } public void onScrollStateChanged(AbsListView view, int scrollState) { // TODO Auto-generated method stub } } 

Creo que es más apropiado utilizar un GridView con 2 columnas, algo así:

 <GridView android:id="@+id/grid_view" android:layout_width="fill_parent" android:layout_height="fill_parent" android:numColumns="2" /> 

Lo que me gustaría hacer es escuchar el evento de desplazamiento para el listview izquierdo y luego desplazar el listview derecho por un desplazamiento correcto. A continuación se muestra mi código, lo probé (muy simple, sólo mostrar mi pensamiento) y puede agregar su código basado en él.

 package viewTest.example.hy; import android.app.Activity; import android.os.Bundle; import android.widget.AbsListView; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.AbsListView.OnScrollListener; public class ViewTestActivity extends Activity { private ArrayAdapter<String> adapter0; private ArrayAdapter<String> adapter1; private String[] array0; private String[] array1; private ListView lv0; private ListView lv1; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); array0 = getResources().getStringArray(R.array.LV0);//letters from A to O array1 = getResources().getStringArray(R.array.LV1);//numbers from 1 to 14 adapter0 = new ArrayAdapter<String>(this, R.layout.item, array0); adapter1 = new ArrayAdapter<String>(this, R.layout.item, array1); lv0 = (ListView) findViewById(R.id.listView1); lv1 = (ListView) findViewById(R.id.listView2); lv0.setAdapter(adapter0); lv1.setAdapter(adapter1); lv0.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { // TODO Auto-generated method stub } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { lv1.setSelection(firstVisibleItem);//force the right listview to scrollyou may have to do some calculation to sync the scrolling status of the two listview. } }); } } 

Y este es el diseño main.xml:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/layout" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" > <ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:scrollbars="none"> </ListView> <ListView android:id="@+id/listView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:scrollbars="none" > </ListView> </LinearLayout> 

Aquí está mi captura de pantalla: Introduzca aquí la descripción de la imagen

Terminé usando la respuesta superior s / o aquí: Android. Desplazamiento de 2 vistas de lista

Interceptar y reorientar eventos parece ser mucho más elegante y consistente que tratar de hacer mis propias matemáticas en las dimensiones y el estado de las listas.

  • Error de enlace no satisfactorio al inicializar el concentrador Myo en Android
  • Arquitectura de aplicaciones de Android: basada en eventos o en capas
  • Comportamiento diferente de la clase Calendar en Java y Android
  • Cómo llamar al método con el parámetro Ver en Android Studio
  • Java dando respuesta incorrecta en un cálculo
  • Cómo usar onclicklistener para ver la cuadrícula
  • ¿Cómo inicia el Android Studio el Garbage Collector y cómo funciona?
  • Cómo analizar 2013-03-13T20: 59: 31 + 0000 cadena de fecha hasta la fecha
  • Java.io.IOException: No queda espacio en el dispositivo Android
  • Regex palabra entera
  • ¿Clase insegura en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.