6

Tôi đang cố gắng để có được điều này làm việc: Tôi về cơ bản muốn có hai Recyclerviews trong một ViewPager. Tôi đã làm theo Hướng dẫn này: http://android-java-development.blogspot.de/2012/05/system.html, nhưng có vẻ như nó không hoạt động. Tôi trông giống như máy nhắn tin xem có sản phẩm nào và chế độ xem của người tái chế không hiển thị.Recyclerviews trong ViewPager

Đây là mã bố trí của tôi:

<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> 

Và PageAdapter tôi:

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); 
    } 
} 

Và phương pháp onCreatView tôi:

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); 

Ở đây tôi đang đi qua các đối tượng con trỏ đến bộ chuyển đổi :

@Override 
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
     ((NewsAdapter) newsPagerAdapter.getAdapterForViewAtIndex(0)).swapCursor(data); 
    } 
+1

Dường như với tôi rằng bạn đã bỏ lỡ các thông số bố cục cho RecyclerView mà bạn đã tạo lập trình. Hãy thử sử dụng một cái gì đó như thế này 'RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams (LayoutParams.MATCH_PARENT, 100);' cho cả hai quan điểm của bạn –

+0

cảm ơn rất nhiều cho câu trả lời của bạn! Rất tiếc, chế độ xem của người tái chế vẫn có vẻ là vô hình – tobs

+0

Bạn có thể cập nhật mã không? –

Trả lời

10

Bạn phải mở rộng FragmentPagerAdapter hoặc FragmentStatePagerAdapter để dễ dàng nhúng RecyclerView. Nếu bạn định cập nhật nội dung ViewPager trong vòng đời của mình, bạn nên sử dụng FragmentStatePagerAdapter

Bạn sẽ phải tạo bố cục phân đoạn bổ sung, có chứa RecyclerView.

Nếu bạn muốn cập nhật ViewPager của mình với SwipeRefreshLayout, đừng bao bọc nó với SwipeRefreshLayout. Thay vào đó, bạn phải có SwipeRefreshLayout bố cục phân đoạn bên trong.

Do đó cho mảnh của bạn, bạn có thể nhận được xml sau:

<?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> 

Và tạo thêm lớp Fragment, mà sẽ thổi phồng bố trí đó và thực hiện phương pháp này, bạn sẽ cần phải cập nhật tình trạng chỉ làm mới.

dụ

Một chút cũ được tìm thấy ở đây: http://developer.android.com/training/implementing-navigation/lateral.html

Nếu bạn muốn kết nối ViewPager của bạn với sự hỗ trợ thư viện mới TabLayout, nó có thể dễ dàng một với:

tabLayout.setupWithViewPager(viewPager); 

Cuối cùng, nếu bạn sẽ cập nhật của bạn "phân mảnh" ViewPager, không cố gắng đặt lại bộ điều hợp, vì các đoạn được quản lý không có bộ điều hợp, nhưng với FragmentManager. Nó là khôn ngoan để cập nhật nội dung của ứng RecyclerViews

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(); 
    } 
} 

lớp MyFragment của bạn có để thực hiện getTitle() phương pháp.

+0

Tôi sẽ đánh dấu đây là câu trả lời vì đó là cùng một kết luận mà tôi đã đưa ra. Tôi chỉ nghĩ rằng sẽ hiệu quả hơn nếu không sử dụng các mảnh vì tôi có cùng một tập dữ liệu cơ bản cho tất cả các khung nhìn. Dù sao, cảm ơn sự giúp đỡ của bạn. – tobs

+2

Cảm ơn bạn. Tôi đã đăng câu trả lời đó vì tôi không thể tìm thấy câu trả lời nào cho câu hỏi đó cho những người khác sẽ tìm kiếm câu hỏi đó trong tương lai =) –

+0

Tôi đã mở rộng FragmentPagerAdapter và từ những ngày cố gắng tìm lý do tại sao RecyclerView không cập nhật. Sau khi đọc câu trả lời của bạn, tôi đã thay đổi mở rộng FragmentStatePagerAdapter và nó hoạt động .. Cảm ơn YOUU –

Các vấn đề liên quan