2014-12-30 15 views
16

Ho creato un'app che utilizza una vista di riciclaggio in un cassetto di navigazione come non si sono mostrati i contenuti della visualizzazione del riciclatore. La vista è sicuramente la loro come posso vedere le ombre di scorrimento. Non sono sicuro di voler aver sbagliato perché l'app non si arresta quando viene eseguita.Visualizzazione Recycler non visualizzata

navigazione cassetto Frammento:

public class NavigationDrawerFragment extends android.support.v4.app.Fragment { 

    public static final String PREF_FILE_NAME = "testPref"; 
    public static final String KEY_USER_LEARNED_DRAWER = "user_learned_drawer"; 
    private RecyclerView mRecyclerView; 
    private ActionBarDrawerToggle mDrawerToggle; 
    private DrawerLayout mDrawerLayout; 
    private View containerView; 
    private Boolean mUserLearnedDrawer; 
    private Boolean mFromSavedInstanceState; 
    private DrawerAdapter adapter; 

    public NavigationDrawerFragment() { 
     mFromSavedInstanceState = false; 
    } 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mUserLearnedDrawer = Boolean.valueOf(readFromPreferences(getActivity(), KEY_USER_LEARNED_DRAWER, "false")); 
     if (savedInstanceState != null){ 
      mFromSavedInstanceState = true; 
     } 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View layout = inflater.inflate(R.layout.fragment_navigation_drawer, container, false); 
     mRecyclerView = (RecyclerView) layout.findViewById(R.id.drawerList); 
     adapter = new DrawerAdapter(getActivity(), getData()); 
     mRecyclerView.setAdapter(adapter); 
     mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 
     return layout; 
    } 

    public static List<DrawerRow> getData(){ 
     List<DrawerRow> data = new ArrayList<>(); 
     int icons[] = {R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher}; 
     String titles[] = {"Link 1","Link 2","Link 3","Link 4"}; 
     for (int i = 0 ; i < titles.length && i < icons.length; i++){ 
      DrawerRow current = new DrawerRow(); 
      current.iconId = icons[i]; 
      current.title = titles[i]; 
      data.add(current); 
     } 

     return data; 
    } 

    public void setUp(int fragmentId, DrawerLayout drawerLayout, Toolbar toolbar) { 
     containerView = getActivity().findViewById(fragmentId); 
     mDrawerLayout = drawerLayout; 
     mDrawerToggle = new ActionBarDrawerToggle(getActivity(), drawerLayout, toolbar, R.string.drawerOpen, R.string.drawerClosed){ 

      @Override 
      public void onDrawerOpened(View drawerView) { 
       super.onDrawerOpened(drawerView); 
       if(!mUserLearnedDrawer){ 
        mUserLearnedDrawer = true; 
        saveToPreferences(getActivity(),KEY_USER_LEARNED_DRAWER, mUserLearnedDrawer+""); 
       } 
       getActivity().invalidateOptionsMenu(); 
      } 

      @Override 
      public void onDrawerClosed(View drawerView) { 
       super.onDrawerClosed(drawerView); 
       getActivity().invalidateOptionsMenu(); 
      } 
     }; 

     if(!mUserLearnedDrawer && !mFromSavedInstanceState){ 
      mDrawerLayout.openDrawer(containerView); 
     } 

     mDrawerLayout.setDrawerListener(mDrawerToggle); 
     mDrawerLayout.post(new Runnable() { 
      @Override 
      public void run() { 
       mDrawerToggle.syncState(); 
      } 
     }); 
    } 

    public void saveToPreferences(Context context, String prefName, String prefValue){ 
     SharedPreferences sharedPreferences = context.getSharedPreferences(PREF_FILE_NAME, Context.MODE_PRIVATE); 
     SharedPreferences.Editor mEditor = sharedPreferences.edit(); 
     mEditor.putString(prefName, prefValue); 
     mEditor.apply(); 
    } 

    public static String readFromPreferences(Context context, String prefName, String defaultValue){ 
     SharedPreferences sharedPreferences = context.getSharedPreferences(PREF_FILE_NAME, Context.MODE_PRIVATE); 
     return sharedPreferences.getString(prefName,defaultValue); 
    } 
} 

Adapter:

public class DrawerAdapter extends RecyclerView.Adapter<DrawerAdapter.MyViewHolder>{ 

    private LayoutInflater inflator; 
    List<DrawerRow> data = Collections.EMPTY_LIST; 

    public DrawerAdapter(FragmentActivity activity, List<DrawerRow> data) { 
     inflator = LayoutInflater.from(activity); 
     this.data = data; 
    } 


    @Override 
    public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
     View view = inflator.inflate(R.layout.nav_drawer_row , viewGroup,false); 
     MyViewHolder holder = new MyViewHolder(view); 
     return holder; 
    } 

    @Override 
    public void onBindViewHolder(MyViewHolder viewHolder, int i) { 
     DrawerRow current = data.get(i); 
     viewHolder.title.setText(current.title); 
     viewHolder.icon.setImageResource(current.iconId); 
    } 

    @Override 
    public int getItemCount() { 
     return 0; 
    } 

    class MyViewHolder extends RecyclerView.ViewHolder{ 
     ImageView icon; 
     TextView title; 

     public MyViewHolder(View itemView) { 
      super(itemView); 
      icon = (ImageView) itemView.findViewById(R.id.list_icon); 
      title = (TextView) itemView.findViewById(R.id.list_text); 
     } 
    } 
} 

cassetto Fila:

public class DrawerRow { 
    int iconId; 
    String title; 
} 

Disposizione:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/drawerLayout"> 

    <!--Main Content --> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical"> 

     <include 
      android:id="@+id/app_bar" 
      layout="@layout/app_bar" /> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="New Text" /> 

    </LinearLayout> 

    <!--Nav Drawer --> 
    <fragment 
     android:layout_width="@dimen/nav_drawer_width" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:name="uk.co.clickcomputing.hhscweatherstation.NavigationDrawerFragment" 
     android:id="@+id/fragment_navigation_drawer"/> 

</android.support.v4.widget.DrawerLayout> 

cassetto Fila:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <ImageView 
     android:padding="@dimen/list_padding" 
     android:id="@+id/list_icon" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_vertical" 
     android:src="@drawable/ic_launcher"/> 

    <TextView 
     android:padding="@dimen/list_padding" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_vertical" 
     android:text="New Text" 
     android:id="@+id/list_text" /> 
</LinearLayout> 

navigazione cassetto Frammento Disposizione:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#eee" 
    android:orientation="vertical"> 

     <ImageView 
      android:layout_width="match_parent" 
      android:layout_height="140dp" 
      android:layout_marginBottom="8dp" 
      android:contentDescription="@string/nav_drawer_img_desciption" 
      android:scaleType="centerCrop" 
      android:src="@drawable/nav_drawer" /> 

     <android.support.v7.widget.RecyclerView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:id="@+id/drawerList"> 

     </android.support.v7.widget.RecyclerView> 
    </LinearLayout> 
+0

È possibile condividere il file di layout che include RecyclerView? Suppongo che tu abbia impostato larghezza o altezza per avvolgere il contenuto, che non è ancora supportato dai gestori di layout predefiniti. – yigit

+0

@yigit aggiornato con il layout – cheese12345

+2

così come ho indovinato, hai Android: layout_height = "wrap_content" nella visualizzazione recycler che non è ancora supportata dai gestori di layout predefiniti. Puoi cambiarlo in match_parent o sovrascrivere onMeasure nel tuo layout manager e fare da solo la misura. – yigit

risposta

53

Il problema è che si sta tornando conta l'elemento come 0 che dice che non ci sono righe da mostrare. Dovresti restituire la dimensione della lista come mostrato di seguito.

@Override 
    public int getItemCount() { 
     return data.size(); 
    } 
+1

Brillante! Non posso credere di aver perso anche questo! – Brandon

+1

Questo mi stava facendo impazzire grazie! :) –

+0

Ho riscontrato questo problema quando aggiorno il mio dataList 'dataList = getMyItems()'. invece uso 'dataList.addAll (getMyItems());' –

3

Sono d'accordo che è necessario per restituire il numero articolo corretto, ma penso che si potrebbe avere un problema con regolazione dell'altezza della vista riciclatore di wrap_content pure. Ho trovato il collegamento this molto utile. Spero che sia d'aiuto.