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?
- No se puede resolver el destino 'android-21'
- ¿Cómo rebatir una solicitud reactiva retrofit en java?
- Código de ejemplo para manejar Excepciones
- ¿Cómo obfuscate el proyecto con Dagger 2.0 usando Proguard?
- Cómo capturar el error 'Bitmap demasiado grande para ser cargado en una textura'
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.
- Android Studio - Keystore fue manipulado o la contraseña fue incorrecta
- ¿Cómo obtener la posición actual de la imagen visualizada?
- Conexión Bluetooth; No puede enviar correctamente las cadenas
- Android rxJava Manejo de errores con retroadaptación
- Daga con Android: ¿Cómo inyectar el contexto cuando se utiliza MVP?
- ¿El onClickListener no actualiza la interfaz de usuario hasta que todo el código dentro de él se haya ejecutado en Android?
- Problemas al crear la aplicación GCM Demo Server
- ¿Hay una manera de pre-cache de una página web para ver con un Android WebView?
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:
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.
- Cómo hacer que este fragmento de diálogo simple semi-transparente
- Actualización de Android Studio 2.0 – public static volatile com.android.tools.fd.runtime.IncrementalChange