在片段中显示RecyclerView

我在Android Lollipop中尝试新的RecyclerView而且我被卡住了。

我正在尝试接收一个列表,在图标的右侧有一个图标和一个TextView ,在Fragment

我find了关于如何设置RecyclerView 精彩教程 。 我已经遵循了每一点,只更改了item_layout.xml以满足我的需求。

该项目构建没有任何错误,但当它在我的设备上启动时,我收到此错误:

java.lang.RuntimeException:无法启动活动ComponentInfo {com.fredrikaldgard.materialcolors / com.fredrikaldgard.materialcolors.MainActivity}:java.lang.NullPointerException:尝试调用虚方法’void android.support.v7.widget.RecyclerView。 setLayoutManager(android.support.v7.widget.RecyclerView $ LayoutManager)’对空对象引用

我试图谷歌问题,但我是Android开发的业余爱好者。

这是我的MainActivity

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 1. get a reference to recyclerView RecyclerView recyclerView = (RecyclerView) findViewById(R.id.list); // 2. set layoutManger recyclerView.setLayoutManager(new LinearLayoutManager(this)); // this is data fro recycler view ItemData itemsData[] = { new ItemData("Indigo",R.drawable.circle), new ItemData("Red",R.drawable.color_ic_launcher), new ItemData("Blue",R.drawable.indigo), new ItemData("Green",R.drawable.circle), new ItemData("Amber",R.drawable.color_ic_launcher), new ItemData("Deep Orange",R.drawable.indigo)}; // 3. create an adapter MyAdapter mAdapter = new MyAdapter(itemsData); // 4. set adapter recyclerView.setAdapter(mAdapter); // 5. set item animator to DefaultAnimator recyclerView.setItemAnimator(new DefaultItemAnimator()); 

而我的MyAdapter

 public class MyAdapter extends RecyclerView.Adapter { private ItemData[] itemsData; public MyAdapter(ItemData[] itemsData) { this.itemsData = itemsData; } // Create new views (invoked by the layout manager) @Override public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { // create a new view View itemLayoutView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.item_layout, null); // create ViewHolder ViewHolder viewHolder = new ViewHolder(itemLayoutView); return viewHolder; } // Replace the contents of a view (invoked by the layout manager) @Override public void onBindViewHolder(ViewHolder viewHolder, int position) { // - get data from your itemsData at this position // - replace the contents of the view with that itemsData viewHolder.txtViewTitle.setText(itemsData[position].getTitle()); viewHolder.imgViewIcon.setImageResource(itemsData[position].getImageUrl()); } // inner class to hold a reference to each item of RecyclerView public static class ViewHolder extends RecyclerView.ViewHolder { public TextView txtViewTitle; public ImageView imgViewIcon; public ViewHolder(View itemLayoutView) { super(itemLayoutView); txtViewTitle = (TextView) itemLayoutView.findViewById(R.id.item_title); imgViewIcon = (ImageView) itemLayoutView.findViewById(R.id.item_icon); } } // Return the size of your itemsData (invoked by the layout manager) @Override public int getItemCount() { return itemsData.length; } } 

编辑:这是Fragment

 public class ColorsFragment extends Fragment { public ColorsFragment(){} @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_colors, container, false); return rootView; } } 

可能出了什么问题?

它已经由android解决了:)

请查看: https : //developer.android.com/samples/RecyclerView/src/com.example.android.recyclerview/RecyclerViewFragment.html

—-更新—– RecyclerView指南的新链接: https : //developer.android.com/guide/topics/ui/layout/recyclerview#java

这是前段时间的问题,但基于@ nacho_zona3提供的答案以及之前的片段经验,问题是当您尝试使用findViewById()方法find它们时尚未创建视图onCreate()来解决这个问题,移动以下代码:

 // 1. get a reference to recyclerView RecyclerView recyclerView = (RecyclerView) findViewById(R.id.list); // 2. set layoutManger recyclerView.setLayoutManager(new LinearLayoutManager(this)); // this is data fro recycler view ItemData itemsData[] = { new ItemData("Indigo",R.drawable.circle), new ItemData("Red",R.drawable.color_ic_launcher), new ItemData("Blue",R.drawable.indigo), new ItemData("Green",R.drawable.circle), new ItemData("Amber",R.drawable.color_ic_launcher), new ItemData("Deep Orange",R.drawable.indigo)}; // 3. create an adapter MyAdapter mAdapter = new MyAdapter(itemsData); // 4. set adapter recyclerView.setAdapter(mAdapter); // 5. set item animator to DefaultAnimator recyclerView.setItemAnimator(new DefaultItemAnimator()); 

到你的片段的onCreateView()调用。 需要进行少量重构,因为从此方法调用的所有variables和方法都必须是静态的。 最终代码应如下所示:

  public class ColorsFragment extends Fragment { public ColorsFragment() {} @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_colors, container, false); // 1. get a reference to recyclerView RecyclerView recyclerView = (RecyclerView) rootView.findViewById(R.id.list); // 2. set layoutManger recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); // this is data fro recycler view ItemData itemsData[] = { new ItemData("Indigo", R.drawable.circle), new ItemData("Red", R.drawable.color_ic_launcher), new ItemData("Blue", R.drawable.indigo), new ItemData("Green", R.drawable.circle), new ItemData("Amber", R.drawable.color_ic_launcher), new ItemData("Deep Orange", R.drawable.indigo) }; // 3. create an adapter MyAdapter mAdapter = new MyAdapter(itemsData); // 4. set adapter recyclerView.setAdapter(mAdapter); // 5. set item animator to DefaultAnimator recyclerView.setItemAnimator(new DefaultItemAnimator()); return rootView; } } 

所以这里最主要的是你调用findViewById()任何地方都需要使用rootView.findViewById()

在使用该视图使核心视图膨胀后,您应该在Fragment检索RecyclerView 。 也许它找不到您的回收商,因为它不是活动的一部分

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final View view = inflater.inflate(R.layout.fragment_artist_tracks, container, false); final FragmentActivity c = getActivity(); final RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView); LinearLayoutManager layoutManager = new LinearLayoutManager(c); recyclerView.setLayoutManager(layoutManager); new Thread(new Runnable() { @Override public void run() { final RecyclerAdapter adapter = new RecyclerAdapter(c); c.runOnUiThread(new Runnable() { @Override public void run() { recyclerView.setAdapter(adapter); } }); } }).start(); return view; }