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:
- Android personalizado ArrayAdapter método getView llamado varias veces - restablecer valor dinámico TextView
- Mostrar menú contextual bajo demanda en Android
- ¿No puede obtener valores de EditViewText de ListView?
- Cómo implementar 2 tipos diferentes de seperators (es decir, encabezados) en una clase de adaptador ListView
- Android listview fila eliminación de animación
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; } }); }
- Simple coursor adaptador con base de datos SQLite y custmize listview
- Cambiar el texto de un botón dentro de un ListView en Android
- ¿Hay alguna manera de probar las pestañas personalizadas de Chrome con Espresso?
- ¿Por qué establecer setBackgroundColor no funciona en mi lista personalizada?
- Pasar la posición en el ListView al niño RecyclerView Adapter
- Detener el controlador después de que se haya destruido el fragmento
- Sin elástico Desplazamiento en ListView
- Cómo construir un diseño complejo en android con múltiples vistas de lista
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);
- HttpURLConnection: lo que hace setFixedLengthStreamingMode () desea el tamaño de?
- Android NFC: Etiqueta perdida cuando el comando APDU se envía a una tarjeta inteligente