6

Sto provando a farlo funzionare: fondamentalmente voglio due panoramiche su un solo ViewPager. Ho seguito questo tutorial: http://android-java-development.blogspot.de/2012/05/system.html, ma non sembra funzionare. Mi sembra che la visualizzazione del cercapersone sia vuota e che la vista del riciclatore non venga visualizzata.Riservazioni di memoria in ViewPager

Ecco il mio codice di layout:

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

E il mio 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); 
    } 
} 

E il mio metodo 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); 

Qui sto passando l'oggetto cursore all'adattatore :

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

Mi sembra che abbiate perso i parametri di layout per le RecyclerViews create a livello di programmazione. Prova ad usare qualcosa come questo 'RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams (LayoutParams.MATCH_PARENT, 100);' per entrambe le tue viste –

+0

grazie mille per la tua risposta! Sfortunatamente, la vista del riciclatore sembra ancora invisibile – tobs

+0

Potresti aggiornare il codice? –

risposta

10

È necessario estendere FragmentPagerAdapter o FragmentStatePagerAdapter per incorporare facilmente RecyclerView. Se avete intenzione di aggiornare i contenuti ViewPager durante il suo ciclo di vita è strettamente consiglia di utilizzare FragmentStatePagerAdapter

Si dovrà creare il layout frammento aggiuntivo, contenente RecyclerView.

Se si desidera aggiornare il ViewPager con SwipeRefreshLayout, non avvolgerlo con SwipeRefreshLayout. Invece, devi avere SwipeRefreshLayout all'interno del layout del frammento.

Pertanto per il vostro frammento si può ottenere il seguente codice 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> 

E creare classe Frammento aggiuntivo, che gonfia il layout ed applicare metodi, che sarà necessario aggiornare lo stato dell'indicatore di aggiornamento.

Un po 'vecchio esempio si trova qui: http://developer.android.com/training/implementing-navigation/lateral.html

Se si desidera collegare il ViewPager con la nuova libreria di supporto TabLayout, è facilmente uno con:

tabLayout.setupWithViewPager(viewPager); 

Infine, se si aggiorna il tuo "frammentato" ViewPager, non provare a ripristinare l'adattatore, poiché i frammenti non sono gestiti con l'adattatore, ma con FragmentManager. È più saggio per aggiornare il contenuto del corrispondente 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(); 
    } 
} 

La classe MyFragment deve implementare getTitle() metodo.

+0

Segnalo come risposta perché è la stessa conclusione a cui sono arrivato. Ho solo pensato che sarebbe stato più efficiente non utilizzare i frammenti perché ho lo stesso set di dati sottostante per tutte le visualizzazioni. Ad ogni modo, grazie per il tuo aiuto. – tobs

+2

Grazie. Ho postato la risposta perché non sono riuscito a trovare alcuna risposta su quella domanda per gli altri uomini che la cercheranno tra cui me stesso in futuro =) –

+0

Ho estorto FragmentPagerAdapter e da giorni ho cercato di scoprire perché RecyclerView non si aggiorna. Dopo aver letto la tua risposta ho cambiato estensione FragmentStatePagerAdapter e ha funzionato .. Grazie YOUU –