Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


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.

  • El evento de desplazamiento del navegador no se dispara con suficiente frecuencia en dispositivos iOS y Android
  • Obtener el elemento visible en el centro de RecycleView al desplazarse
  • ¿Cómo trabajar, cuando listview dentro del scrollview?
  • Retraso de desplazamiento con GestureDetector onScroll
  • Android: FastScrolling SectionIndexer getSections () se llama sólo una vez
  • Cómo desplazar una actividad verticalmente en Android
  • Android personalizado listview muy lento al desplazarse
  • Sincronizar las posiciones de desplazamiento ScrollView - android
  • 2 Solutions collect form web for “Sincronización de dos ListViews lado a lado de Android”

    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.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.