【发布时间】:2014-12-24 14:36:54
【问题描述】:
我正在 Android Lollipop 中试用新的 RecyclerView,但我卡住了。
我正在尝试接收一个列表,其中包含一个图标和一个 TextView 图标右侧的 Fragment 内。
I found this great tutorial 了解如何设置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<MyAdapter.ViewHolder> {
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;
}
}
可能出了什么问题?
【问题讨论】:
-
您的 xml 布局文件中是否还有带有 id 列表的 RecyclerView?如果不是,recyclerView 变量将在步骤 2 中为空。
-
是的,我的 xml 中有一个 RecyclerView,ID 为“list”。
-
应该更清楚:在
activity_main.xml文件中,对吧? -
@stkent 好吧,我使用导航抽屉,当我单击抽屉中的一个项目时,它会打开一个活动。我的 activity_main.xml 包含一个 FrameLayout,里面有抽屉。我的 RecyclerView 位于名为 fragment_color.xml 的 XML 文件中。
标签: java android android-fragments android-5.0-lollipop android-recyclerview