Fragment中RecyclerView适配触发NullPointerException问题求助
问题定位与解决方案
核心问题分析
触发java.lang.NullPointerException的根源是视图控件无法被正确找到,具体存在三处错误:
1. Adapter加载了错误的布局
MyAdapter的onCreateViewHolder方法中,你加载的是Fragment的布局R.layout.fragment_item_list,但此处应该加载RecyclerView单个item的布局文件(比如item_recycler.xml)。Fragment布局是RecyclerView的容器,而非item的内容布局,导致ViewHolder无法找到titleText和titleImage控件。
2. ViewHolder中控件ID拼写错误
初始化titleImage时,ID被写成R.id.titleiImage(多了一个字母i),正确ID应为R.id.titleImage,这直接导致titleImage对象为null。
3. Fragment错误强转View为RecyclerView
在ItemFragment的onCreateView方法中,你直接将整个inflated的View强转为RecyclerView:
recyclerView = (RecyclerView) view;
正确做法是从View中通过ID查找RecyclerView控件:
recyclerView = view.findViewById(R.id.recyclerView);
(前提是fragment_item_list.xml中存在ID为recyclerView的RecyclerView控件)
修正后的代码
1. 修正MyAdapter代码
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { Context context; ArrayList<Item> itemArrayList; public MyAdapter(Context context, ArrayList<Item> itemArrayList) { this.context = context; this.itemArrayList = itemArrayList; } @NonNull @Override public MyAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { // 替换为你的RecyclerView Item布局 View view = LayoutInflater.from(context).inflate(R.layout.item_recycler, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { Item item = itemArrayList.get(position); holder.titleText.setText(item.getText()); holder.titleImage.setImageResource(item.getImage()); } @Override public int getItemCount() { return itemArrayList.size(); } public static class ViewHolder extends RecyclerView.ViewHolder{ ImageView titleImage; TextView titleText; public ViewHolder(@NonNull View itemView) { super(itemView); // 修正ID拼写错误 titleImage = itemView.findViewById(R.id.titleImage); titleText = itemView.findViewById(R.id.titleText); } } }
2. 修正ItemFragment代码
public class ItemFragment extends Fragment { private ArrayList<Item> itemArrayList; private int[] imageResourceId; private String[] texts; private MyAdapter myAdapter; private RecyclerView recyclerView; public ItemFragment() { } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_item_list, container, false); dataInitialize(); myAdapter = new MyAdapter(getContext(), itemArrayList); // 正确获取RecyclerView控件 recyclerView = view.findViewById(R.id.recyclerView); // 必须设置LayoutManager,否则RecyclerView无法显示内容 recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); recyclerView.setAdapter(myAdapter); return view; } private void dataInitialize() { itemArrayList = new ArrayList<>(); imageResourceId = new int[] { R.drawable.ic_launcher_background, R.drawable.ic_launcher_background, R.drawable.ic_launcher_background, }; texts = new String[] { getString(R.string.blackpink), getString(R.string.redvelvet), getString(R.string.itzy), }; for(int i = 0; i < texts.length; i++) { Item item = new Item(imageResourceId[i], texts[i]); itemArrayList.add(item); } } }
3. 布局补充说明
- 确保
fragment_item_list.xml中包含RecyclerView控件:
<androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent"/>
- 确保RecyclerView的item布局(如
item_recycler.xml)中包含titleImage和titleText控件,ID与代码中一致。
内容的提问来源于stack exchange,提问作者Fyord M
相关产品推荐
相关产品推荐

