2014-12-30 17 views
16

Tôi đã tạo một ứng dụng sử dụng chế độ xem tái chế trong ngăn điều hướng cách nội dung của chế độ xem của người tái chế không hiển thị. Quan điểm chắc chắn là của họ khi tôi có thể nhìn thấy bóng di chuyển. Tôi không chắc chắn tôi muốn làm sai như ứng dụng không sụp đổ khi nó được chạy.Recycler View Không hiển thị

Navigation Drawer Fragment:

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

Adaptor:

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

Drawer Row:

public class DrawerRow { 
    int iconId; 
    String title; 
} 

Layout:

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

Drawer Row:

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

Navigation Drawer Fragment Layout:

<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

Bạn có thể chia sẻ tệp bố cục bao gồm RecyclerView không? Đoán của tôi là bạn đã đặt chiều rộng hoặc chiều cao để bao bọc nội dung, chưa được trình quản lý bố cục mặc định hỗ trợ. – yigit

+0

@yigit được cập nhật với bố cục – cheese12345

+2

vì vậy như tôi đoán, bạn có android: layout_height = "wrap_content" trên chế độ xem tái chế chưa được hỗ trợ bởi trình quản lý bố cục mặc định. Bạn có thể thay đổi thành match_parent hoặc ghi đè lênMeasure trong trình quản lý bố cục và tự mình thực hiện phép đo. – yigit

Trả lời

53

Vấn đề là bạn đang trở về mục được tính là 0 mà nói rằng không có hàng để hiển thị. Bạn nên trả về kích thước của Danh sách như hình dưới đây.

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

Brilliant! Không thể tin rằng tôi đã bỏ lỡ điều này! – Brandon

+1

Điều này khiến tôi cảm thấy điên rồ! :) –

+0

Tôi gặp vấn đề này khi cập nhật dataList 'dataList = getMyItems()'. thay vào đó tôi sử dụng 'dataList.addAll (getMyItems());' –

3

Tôi đồng ý rằng bạn cần trả lại số mặt hàng chính xác nhưng tôi nghĩ bạn có thể gặp vấn đề với việc đặt chiều cao của chế độ xem của người tái chế thành wrap_content. Tôi thấy liên kết this rất hữu ích. Hy vọng nó giúp.

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