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?
- ¿Cómo obtener el recuento de líneas de textview antes de renderizar?
- Tienen menú sólo aparecen en la barra de acción si ParseUser está viendo su propia publicación
- AudioTrack - matriz corta a la distorsión de la matriz del byte usando jlayer (decodificador del java mp3)
- Android java.lang.NullPointerException: Intento de obtener longitud de matriz nula
- ¿Qué es una buena práctica de tratar con algunas excepciones HTTP de tiempo de ejecución?
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.
- Deshabilitar el botón Inicio en la aplicación de pantalla de inicio?
- Pasar un objeto JavaScript usando addJavascriptInterface () en Android
- ¿Cómo habilitar la inspección después de haber sido inhabilitado en Android Studio?
- Compostabilidad de FutureTask de Java
- Android-Magento- Cómo obtener los detalles de varios productos en Android mediante XML-RPC
- La fusión de clips mp4 con mp4parser hace que el audio detrás del video
- Cómo convertir String en String y viceversa en Android
- ¿Dónde está la vista previa del diseño de Android Studio?
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