Recyclerviews en ViewPager
Estoy tratando de conseguir este trabajo: básicamente quiero dos Recyclerviews en un ViewPager. He seguido este Tutorial: http://android-java-development.blogspot.de/2012/05/system.html , pero no parece funcionar. Parece que el paginador de vista está vacío y la vista de reciclador no aparece.
Aquí está mi código de diseño:
- ¿Qué es la contraparte de RecyclerView.Adapter de ListView.Adpater.isEnabled ()
- NullPointerException en ViewPager con Recyclerview
- RecyclerView.ViewHolder - getLayoutPosition vs getAdapterPosition
- Cómo abrir un fragmento diferente en recyclerview OnClick
- Attr / colorError error no encontrado al usar com.android.support:recyclerview-v7:26.0.0-beta2
<android.support.v4.widget.SwipeRefreshLayout android:id="@+id/pager_refresh_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingTop="@dimen/tab_height"> <android.support.v4.view.ViewPager android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/accent"/> </android.support.v4.widget.SwipeRefreshLayout>
Y mi PageAdapter:
public class NewsPagerAdapter extends PagerAdapter { private Context context; private Vector<RecyclerView> recyclerViewList; private String[] titles; public NewsPagerAdapter(Context context, int titlesId) { this.context = context; this.recyclerViewList = new Vector<>(); setTitles(titlesId); } public void add(RecyclerView recyclerView) { recyclerViewList.add(recyclerView); } public RecyclerView.Adapter getAdapterForViewAtIndex(int index) { return recyclerViewList.get(index).getAdapter(); } @Override public Object instantiateItem(ViewGroup container, int position) { container.addView(recyclerViewList.get(position), new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 100) ); return container; } @Override public int getCount() { return recyclerViewList.size(); } @Override public boolean isViewFromObject(View view, Object object) { return view.equals(object); } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } @Override public CharSequence getPageTitle(int position) { return titles[position]; } public void setTitles(int titles) { this.titles = context.getResources().getStringArray(titles); } }
Y mi método onCreatView:
GridLayoutManager layoutManager1 = new GridLayoutManager(getActivity(), getResources().getInteger(R.integer.news_column_count)); GridLayoutManager layoutManager2 = new GridLayoutManager(getActivity(), getResources().getInteger(R.integer.news_column_count)); RecyclerView listView1 = new RecyclerView(getActivity()); RecyclerView listView2 = new RecyclerView(getActivity()); listView1.setLayoutManager(layoutManager1); listView2.setLayoutManager(layoutManager2); NewsAdapter adapter1 = new NewsAdapter(getActivity(), null); NewsAdapter adapter2 = new NewsAdapter(getActivity(), null); adapter1.setOnItemClickListener(this); adapter2.setOnItemClickListener(this); listView1.setAdapter(adapter1); listView2.setAdapter(adapter2); newsPagerAdapter.add(listView1); newsPagerAdapter.add(listView2); newsViewPager.setAdapter(newsPagerAdapter);
Aquí estoy pasando el objeto cursor al adaptador:
@Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { ((NewsAdapter) newsPagerAdapter.getAdapterForViewAtIndex(0)).swapCursor(data); }
- ¿Puedo usar más de 2 vistas de reciclador en una actividad?
- Picasso problema de extracción de imágenes cuando se utiliza con RecyclerView
- Eliminar el espaciado predeterminado en la vista de reciclador
- Getter no está asociado a ningún campo - Realm
- Cómo implementar gridlayoutmanager horizontal
- Biblioteca avanzada de RecyclerView - ejemplos de código
- Personalizar RecyclerView LayoutManager no fling (sin problemas)
- RecyclerView horizontal con relleno inicial
Tienes que extender FragmentPagerAdapter
o FragmentStatePagerAdapter
para incrustar fácilmente RecyclerView. Si va a actualizar los contenidos de ViewPager durante su ciclo de vida, se recomienda usar FragmentStatePagerAdapter
Tendrás que crear un diseño de fragmento adicional que contenga RecyclerView
.
Si desea actualizar su ViewPager
con SwipeRefreshLayout
, no lo envuelva con SwipeRefreshLayout
. En su lugar, debe tener SwipeRefreshLayout
dentro del diseño del fragmento.
Por lo tanto, para su fragmento puede obtener el siguiente xml:
<?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/listRefresh" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/categoryList" android:scrollbars="vertical" android:layout_width="match_parent" android:layout_height="match_parent"/> </android.support.v4.widget.SwipeRefreshLayout>
Y crear una clase Fragment adicional, que inflarán ese diseño e implementarán métodos, que necesitará actualizar el estado del indicador de actualización.
Un ejemplo un poco antiguo se encuentra aquí: http://developer.android.com/training/implementing-navigation/lateral.html
Si desea conectar su ViewPager con la nueva biblioteca de soporte TabLayout, es fácilmente uno con:
tabLayout.setupWithViewPager(viewPager);
Por último, si va a actualizar su "fragmentado" ViewPager
, no intente restablecer el adaptador, ya que los fragmentos se gestionan no con el adaptador, pero con FragmentManager
. Es más sabio actualizar el contenido de las RecyclerViews
correspondientes
public class MyFragmentedPagerAdapter extends FragmentStatePagerAdapter { private final TabLayout mTabLayout; private final SwipeRefreshLayout.OnRefreshListener mRefreshListener; private Vector<PriceListFragment> fragmentList; private Vector<String> titles; public MyFragmentedPagerAdapter(FragmentManager fm, MyComplexData data, OnCartActionListener listener, TabLayout tabLayout, SwipeRefreshLayout.OnRefreshListener refreshListener) { super(fm); mTabLayout = tabLayout; // external refresh listener, that will trigger an updateData() mRefreshListener = refreshListener; fragmentList = new Vector<>(); titles = new Vector<>(); updateData(data); } public void updateData(MyComplexData data) { boolean updateTabs = false; boolean hasNewData = false; Vector<String> newTitles = new Vector<>(); int position = 0; for(TabContents tabContents : data.getTabContents()) { if(tabContents.getListContents() == null) continue; hasNewData = true; boolean isNewFragment; MyFragment fragment; try { fragment = fragmentList.get(position); isNewFragment = false; } catch (ArrayIndexOutOfBoundsException e) { fragment = new MyFragment(); isNewFragment = true; } // Update the data, title and hide update indicator of SwipeRefreshLayout fragment.setTabContents(tabContents); newTitles.add(tabContents.getName()); if(isNewFragment) { fragment.setRefreshListener(mRefreshListener); fragmentList.add(fragment); } position++; } if(!hasNewData) return; // we need to decide, whether to update tabs if(titles.size() != newTitles.size()) { updateTabs = true; } else { for(position = 0; position < titles.size(); position++) { if(!titles.get(position).equals(newTitles.get(position))) { updateTabs = true; break; } } } titles = newTitles; notifyDataSetChanged(); if(updateTabs) mTabLayout.setTabsFromPagerAdapter(this); } @Override public Fragment getItem(int position) { return fragmentList.get(position); } // You need to override this method as well @Override public int getItemPosition(Object object) { MyFragment fragment = (MyFragment) object; String title = (String) fragment.getTitle(); int position = titles.indexOf(title); if (position >= 0) { return position; } else { return POSITION_NONE; } } @Override public int getCount() { return titles.size(); } @Override public CharSequence getPageTitle(int position) { return fragmentList.get(position).getTitle(); } }
Tu clase MyFragment
tiene que implementar el método getTitle()
.
- ¿Hay una manera de detener la ejecución de un HttpClient en un AsyncTask?
- Cómo anclar un botón en la parte inferior de un diseño relativo en android