Sincronizar todo el ListView en un ViewPager

En mi aplicación tengo un ViewPager con cada uno de ellos un ListView personalizado enlazado como una fila en una tabla. El problema es que cuando desplazo un ListView en la primera página y luego desplazo el ViewPager el ListView de la primera página y el ListView de la segunda página están desalineados. El listView debe estar alineado porque en el primero tengo un TextView con una descripción y luego 4 coloumns con datos y en el siguiente ListViews 6 coloumns sin la descripción así que si están desalineados es muy complicado. Entonces, ¿cómo puedo desplazar todos los listViews a la vez ??

EDITAR:

Muchas gracias a Rahul Parsani … Por fin he logrado cómo hacer esto … Si tienes la listView en fragmento separado y el número del fragmento es indefinido esta es la respuesta:

final ArrayList<ListView> lvs = new ArrayList<ListView>(); for (int j = 0; j < adapter.getCount(); j++) { YourFragment fragJ = (YourFragment) adapter.getItem(j); final ListView listViewJ = fragJ.lv; lvs.add(listViewJ); } for (int j = 0; j < lvs.size(); j++) { final int x = j; lvs.get(j).setOnTouchListener(new OnTouchListener() { boolean dispatched = false; @Override public boolean onTouch(View v, MotionEvent event) { if (!dispatched) { dispatched = true; if (x != 0) { lvs.get(x - 1).dispatchTouchEvent(event); }; if (x != lvs.size() - 1) { lvs.get(x + 1).dispatchTouchEvent(event); } } dispatched = false; return false; } }); } 

Lo que intenta hacer es sincronizar las vistas de lista. Hay una biblioteca que ya implementa esto para dos listas aquí . Voy a tratar de explicar la parte del código fuente relevante para usted que se encuentra en la actividad aquí .

Suponga que si tiene acceso a todas sus vistas de lista a través de variables:

 listViewOne = (ListView) findViewById(R.id.list_view_one); listViewTwo = (ListView) findViewById(R.id.list_view_two); listViewThree = (ListView) findViewById(R.id.list_view_three); listViewFour = (ListView) findViewById(R.id.list_view_four); 

Establezca los mismos oyentes táctiles en ellos:

 listViewOne.setOnTouchListener(touchListener); listViewTwo.setOnTouchListener(touchListener); // similarly for listViewThree & listViewFour 

La idea básica del oyente táctil es enviar los eventos a las otras vistas de modo que también se desplacen de forma sincrónica con la vista de lista que se está tocando.

 // Passing the touch event to the opposite list OnTouchListener touchListener = new OnTouchListener() { boolean dispatched = false; @Override public boolean onTouch(View v, MotionEvent event) { if (v.equals(listViewOne) && !dispatched) { dispatched = true; listViewTwo.dispatchTouchEvent(event); listViewThree.dispatchTouchEvent(event); listViewFour.dispatchTouchEvent(event); } else if (v.equals(listViewTwo) && !dispatched) { dispatched = true; listViewOne.dispatchTouchEvent(event); listViewThree.dispatchTouchEvent(event); listViewFour.dispatchTouchEvent(event); } // similarly for listViewThree & listViewFour dispatched = false; return false; } }; 

La biblioteca también ha establecido un oyente de desplazamiento, que creo que se utiliza porque las vistas pueden ser de diferentes alturas, que usted no tiene. Trate de hacerme saber si esto funciona.

El problema que está teniendo es similar a este Update ViewPager dinámicamente? . No tiene nada que ver con la configuración de onTouchListener porque no tiene acceso a todos los ListView s dentro de ViewPager .

A continuación se muestra un código que funciona y se ha probado . El punto clave es el método getItemPosition() en PagerAdapter .

 import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentStatePagerAdapter; import android.support.v4.app.ListFragment; import android.support.v4.view.ViewPager; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; import android.widget.ArrayAdapter; import android.widget.ListView; public class MainActivity extends FragmentActivity implements ScrollListener { private MyPagerAdapter mPagerAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MyPagerAdapter pagerAdapter = mPagerAdapter = new MyPagerAdapter( getSupportFragmentManager(), this); pagerAdapter.addFragmentInfo(DummyFragment.class.getName(), "First", new Bundle()); pagerAdapter.addFragmentInfo(DummyFragment.class.getName(), "Second", new Bundle()); pagerAdapter.addFragmentInfo(DummyFragment.class.getName(), "Third", new Bundle()); final ViewPager pager = (ViewPager) findViewById(R.id.pager); pager.setOffscreenPageLimit(2); pager.setAdapter(pagerAdapter); } @Override public void onScrollChanged(int index) { mPagerAdapter.setIndex(index); } @Override public int getCurrentScrollIndex() { return mPagerAdapter == null ? 0 : mPagerAdapter .getCurrentScrollIndex(); } public static class MyPagerAdapter extends FragmentStatePagerAdapter { public static class FragmentInfo { public FragmentInfo(String fragmentName, String title, Bundle args) { super(); this.fragmentName = fragmentName; this.title = title; this.args = args; } String fragmentName; String title; Bundle args; } private List<FragmentInfo> mFragmentInfos = new ArrayList<FragmentInfo>(); private final Context mContext; private int mIndex; public MyPagerAdapter(FragmentManager fm, Context context) { super(fm); mContext = context; } @Override public Fragment getItem(int position) { FragmentInfo info = mFragmentInfos.get(position); Fragment fragment = Fragment.instantiate(mContext, info.fragmentName, info.args); return fragment; } @Override public int getCount() { return mFragmentInfos.size(); } @Override public int getItemPosition(Object object) { if (object instanceof ScrollRefreshable) { ((ScrollRefreshable) object).refreshScroll(mIndex); } return super.getItemPosition(object); } public void addFragmentInfo(String fragmentName, String title, Bundle args) { mFragmentInfos.add(new FragmentInfo(fragmentName, title, args)); } public void setIndex(int index) { mIndex = index; notifyDataSetChanged(); } public int getCurrentScrollIndex() { return mIndex; } } public static class DummyFragment extends ListFragment implements ScrollRefreshable { private ScrollListener mRefreshListener; @Override public void onAttach(Activity activity) { super.onAttach(activity); if (activity instanceof ScrollListener) { mRefreshListener = (ScrollListener) activity; } } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); String[] values = new String[] { "Android", "iPhone", "WindowsMobile", "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2", "Android2", "iPhone2", "WindowsMobile2", "Blackberry2", "WebOS2", "Ubuntu2", "Windows72", "Max OS X2", "Linux2", "OS/22" }; ArrayAdapter<String> adapter = new ArrayAdapter<String>( getActivity(), android.R.layout.simple_list_item_1, values); setListAdapter(adapter); getListView().setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { if (scrollState == SCROLL_STATE_IDLE) { if (mRefreshListener != null) { mRefreshListener.onScrollChanged(view .getFirstVisiblePosition()); } } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { } }); // update scroll position at start if (mRefreshListener != null) { int index = mRefreshListener.getCurrentScrollIndex(); scrollListViewTo(index); } } @Override public void refreshScroll(int index) { scrollListViewTo(index); } private void scrollListViewTo(int index) { ListView lv = getListView(); if (lv != null) { lv.setSelection(index); } } } } interface ScrollRefreshable { public void refreshScroll(int index); } interface ScrollListener { public void onScrollChanged(int index); public int getCurrentScrollIndex(); } 

¿Son iguales las alturas del elemento listview? Si es así, podría pasar la posición del elemento visible superior a los otros adaptadores listview.

  int curTop=listview.getFirstVisiblePosition(); listview2.setSelection(curTop); 
  • Android: crea un LinearLayout que contiene un ListView desplazable
  • Ocultar y mostrar el botón flotante mientras que los rollos de ListView
  • Deshabilitar listview supercroll en samsung android
  • Búsqueda / filtrado ListView por varios criterios
  • ¿Cómo agregar un listview dentro de un viewpager?
  • Android.content.res.Resources $ NotFoundException: Cadena de recursos ID # 0x0
  • Cómo crear listview onItemclicklistener
  • ListView vacía después de volver al fragmento
  • ¿Cómo puedo configurar onClickListener en ArrayAdapter?
  • Bauerca drag-sort-listview ejemplo sencillo
  • Android.R.color.transparent no es totalmente transparente
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.