RecyclerView触发NullPointerException崩溃问题求助
解决RecyclerView NullPointerException崩溃问题
嘿,我一眼就揪出问题所在啦!你的崩溃原因很明确——你把还没初始化的WordList传给了RecyclerAdapter,导致Adapter里的列表一直是null,当RecyclerView调用Adapter的getItemCount()方法时,自然就触发了NullPointerException(因为你在调用一个null对象的size()方法)。
问题出在代码顺序上
看你的MainActivity的onCreate方法:
recyclerView = findViewById(R.id.recyclerView); // 这里WordList还没初始化,是null! recyclerAdapter = new RecyclerAdapter(WordList); recyclerView.setAdapter(recyclerAdapter); // ... 然后才初始化WordList并添加数据 WordList = new ArrayList<>(); WordList.add("First"); // ... 其他add操作
你先把null的WordList传给了Adapter,之后才去实例化列表并添加数据,但Adapter拿到的始终是最初的那个null引用,根本没拿到你后来创建的列表。
修复步骤
1. 调整代码顺序,先初始化列表再创建Adapter
把代码改成这样:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); recyclerView = findViewById(R.id.recyclerView); // 第一步:先初始化列表并添加所有数据 WordList = new ArrayList<>(); WordList.add("First"); WordList.add("Chairman's (צ'רמנז)"); WordList.add("The Cheesy Poofs 254 (צ'יזי פופס)"); WordList.add("Hamosad 1657 (המוסד)"); WordList.add("Orbit 1690 (אורביט)"); WordList.add("Game Changers"); WordList.add("Infinite Recharge"); WordList.add("Deep Space"); WordList.add("Power Up"); WordList.add("Eyal Hershko (הרשקו המלך)"); WordList.add("Washer (שייבה)"); WordList.add("Soldering Iron (מלחם)"); WordList.add("Soldering Paste (משחת הלחמה"); WordList.add("Soldering Tin (בדיל)"); WordList.add("RoboRio (רובוריו)"); // 第二步:再创建Adapter并设置给RecyclerView recyclerAdapter = new RecyclerAdapter(WordList); recyclerView.setAdapter(recyclerAdapter); DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(this, DividerItemDecoration.VERTICAL); recyclerView.addItemDecoration(dividerItemDecoration); }
2. 给Adapter加个空判断(双重保险)
为了防止后续其他场景下列表为null导致崩溃,建议在你的RecyclerAdapter的getItemCount()方法里添加空判断:
@Override public int getItemCount() { // 如果列表不为null就返回size,否则返回0 return WordList != null ? WordList.size() : 0; }
另外注意你刚才误把row_item.xml的代码当成了RecyclerAdapter的代码,确保你的Adapter类是正确的,比如基本结构应该像这样:
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> { private List<String> wordList; // 构造方法接收列表 public RecyclerAdapter(List<String> wordList) { this.wordList = wordList; } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { // 加载row_item布局 View view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.row_item, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { // 绑定数据到TextView holder.textView.setText(wordList.get(position)); } @Override public int getItemCount() { return wordList != null ? wordList.size() : 0; } // ViewHolder类 public static class ViewHolder extends RecyclerView.ViewHolder { TextView textView; public ViewHolder(@NonNull View itemView) { super(itemView); textView = itemView.findViewById(R.id.textView); } } }
这样调整后,你的RecyclerView就能正常加载数据啦!
内容的提问来源于stack exchange,提问作者רועי פנחסי
相关产品推荐
相关产品推荐

