Sincronización de dos ListViews lado a lado de Android

Estoy tratando de hacer dos ListViews lado a lado actúan como un GridView hasta cierto punto. La razón por la que no estoy utilizando GridView es porque no hay soporte para una mirada escalonada. De todos modos, tengo el siguiente código hasta el momento:

<- Código antiguo, ahora irrelevante ->

EDITAR:

Hice como @Sam sugirió y utilizó el código siguiente:

lv1.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (touchSource == null) { touchSource = v; } if (v == touchSource) { lv2.dispatchTouchEvent(event); if (event.getAction() == MotionEvent.ACTION_UP) { clickSource = v; touchSource = null; } } return false; } }); lv1.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (parent == clickSource) { //my own code here } } }); lv1.setOnScrollListener(new OnScrollListener() { @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (view == clickSource) { } boolean loadMore = /* maybe add a padding */ firstVisibleItem + visibleItemCount + 10 >= totalItemCount; if (loadMore) { //add items, load more } } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } }); lv2.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (touchSource == null) { touchSource = v; } if (v == touchSource) { lv1.dispatchTouchEvent(event); if (event.getAction() == MotionEvent.ACTION_UP) { clickSource = v; touchSource = null; } } return false; } }); lv2.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (parent == clickSource) { } } }); lv2.setOnScrollListener(new OnScrollListener() { @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (view == clickSource) { } boolean loadMore = /* maybe add a padding */ firstVisibleItem + visibleItemCount + 2 >= totalItemCount; if (loadMore) { } } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } }); 

También estoy usando un encabezado en una de las listas para crear un efecto escalonado y necesito mantener este escalonamiento a toda costa. Esto está trabajando sobre todo (el código antedicho) pero unsyncs mucho del tiempo. He averiguado esto es sólo cuando tengo pequeños golpes cortos. No estoy seguro de por qué, y no puedo encontrar una buena solución. Me parece que la lógica anterior debería funcionar.

Además, en caso de que importe, estoy utilizando UniversalImageLoader para cargar fotos y una lógica EndlessScroll simple para cargar más fotos (llamando directamente a adapter.notifyDataSetChanged ()). Sin embargo, esto no parece muy relevante. Incluso cuando las fotos se cargan, todavía puedo ver que no es sincero.

Quiero ser claro: si hago cortos swipes (ya veces sólo en general repetido desplazamiento) puedo unsync las listas a voluntad.

Cualquier ayuda es apreciada. Gracias.

EDIT 2:

Sin embargo, para encontrar una buena solución. Estas son las soluciones que he encontrado que no funcionan bien:

  • La solución anterior: no sincroniza demasiado a menudo
  • Vista de lista de Pinterest : no diferenciación de OnScrollListener / onItemClick
  • StaggeredGridView : no onScrollListener
  • Stag Project : No hay un oyente de onItemClick
  • Método de diseño lineal : no onItemClick Listener

¿Algunas ideas? Gracias.

Bueno, terminé usando el Linear Layout Method (ver la pregunta) y usé setTag para que el onItemClickListener funcionara, y una implementación CustomScrollView para que la lista infinita funcionara.

Básicamente, dos linearLayouts apilados horizontalmente, dentro de una vista de desplazamiento. Funciona bastante bien, y se carga mucho más rápido.

También, para cargar mis imágenes SmartImageView si eso ayudó.

Si alguien quiere el código, podría publicar partes de él.

En lugar de escuchar a onTouch, ¿por qué no se desplaza listas en el listener onScroll de ListViews. Eso es lo que estoy usando en esa biblioteca con el tipo de pistas el rollo de un ListView de manera similar y funciona como un encanto. Echa un vistazo a este archivo. https://github.com/JlUgia/list_moving_container/blob/master/src/com/ugia/listmovingcontainer/fragment/BottomListMovingContainerFragment.java

Preste especial atención a 81 (no olvide agregar el oyente de actualizador de diseño global) y 89 (con el escucha onScroll). De esa manera usted puede olvidarse de los hacks de clic también.

ACTUALIZAR

Lo codificaría de la siguiente manera.

 lv1.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { updateListPosition(lv2, lv1); } }); lv1.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { updateListPosition(lv2, lv1); } }); lv2.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { updateListPosition(lv1, lv2); } }); lv2.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { updateListPosition(lv1, lv2); } }); private void updateListPosition(ListView updatedList, ListView scrolledList){ updatedList.setScrollY(scrolledList.getScrollY()); } 

** setScrollY ya invalida su lista.

** Tenga en cuenta que no probé el código. Aunque debe ser bastante simple.

  • Vista de cuadrícula de desplazamiento horizontal
  • Scrollview no desliza cuando es demasiado corto para desplazarse
  • Cómo detener el desplazamiento interno de WebView en Android?
  • WebView en Galería deteniendo eventos de desplazamiento / toque
  • Cómo habilitar el desplazamiento en un simpleadapter en el firmware X16 de Google Glass
  • Android ListView agrega elementos a la parte superior sin vista de lista desplácese
  • Desplazamiento de un TextView a una línea específica
  • Bloqueo de scroll de gridview
  • ¿Cómo obtener las flechas derecha / izquierda en Actividad para indicar más pantallas a la derecha / izquierda?
  • Desplazamiento bidireccional para Android
  • Android scroll down
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.