2014-12-30 190 views
16

我一直在制作一个应用程序,该应用程序在导航抽屉中使用回收站视图,回收站视图的内容未显示出来。视图肯定是他们的,因为我可以看到滚动阴影。我不确定我是否做错了,因为它在运行时不会崩溃。Recycler View Not Showing

导航抽屉片段:

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

适配器:

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

抽屉行:

public class DrawerRow { 
    int iconId; 
    String title; 
} 

布局:

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

抽屉行:

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

抽屉式导航片段布局:

<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

你能分享包含RecyclerView的布局文件吗? 我的猜测是你已经设置了宽度或高度来包装内容,但是默认布局管理器尚不支持。 – yigit

+0

@yigit根据布局 – cheese12345

+2

进行了更新,因此我猜测,在回收站视图中有android:layout_height =“wrap_content”,但尚未由默认布局管理器支持。 您可以将其更改为match_parent或覆盖布局管理器中的onMeasure,并自己进行测量。 – yigit

回答

53

的问题是,你正在返回的项目数为0,它告诉,没有行显示。您应该返回列表的大小,如下所示。

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

太棒了!不能相信我也错过了! – Brandon

+1

这让我疯狂的感谢! :) –

+0

我更新我的dataList'dataList = getMyItems()'时遇到了这个问题。相反,我使用'dataList.addAll(getMyItems());' –

3

我同意你需要返回正确的项目编号,但我认为你可能有设置回收视图的高度WRAP_CONTENT还有一个问题。我发现this链接非常有帮助。希望能帮助到你。