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.

  • Ubicación de Google Play No conectado. Llame a connect () y espere a que onConnected () se llame
  • 'Código fuente no coincide con el bytecode' al depurar en un dispositivo
  • Necesito comparar las coordenadas de la latitud y de la longitud que dirán a un usuario del GPS cuál es el restaurante de Hooters más cercano a su posición actual
  • IntelliJ IDEA 12 clase duplicada R.java y BuildConfig.java
  • EditText en ListView necesita ajustarResize pero tiene error de foco perdidoso
  • Actualizaciones de interfaz de usuario de subprocesos en Android
  • Cómo obtener valor almacenado en ArrayList <HashMap <clave, valor >>?
  • Utilice bases de datos pre-pobladas con Realm
  • Firebase cláusula WHERE múltiple en la consulta
  • ¿Cómo agregar icono de búsqueda con texto como sugerencia en el campo de texto?
  • Android instrumentación prueba java.lang.UnsatisfiedLinkError en el uso de AndroidJunitRunner y AndroidJUnit4
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.