在MainActivity其他方法设置RecyclerView可见性时遇空指针异常
问题原因分析
你遇到的NullPointerException核心原因有两个:
- 错误创建Activity实例:在ViewHolder的点击事件里
MainActivity mainActivity = new MainActivity();是完全错误的做法——Android的Activity实例由系统生命周期管理,手动new出来的实例不会执行onCreate方法,因此mainActivity.suggestList根本没被初始化,自然是null,调用setVisibility就会触发空指针。 - 不必要的列表重新初始化:
StockPrice方法里重新创建stockPriceList = new ArrayList<>();会替换掉原来绑定给adapter的列表,导致后续添加的数据无法显示在界面上。
解决方案
我们通过接口回调让MainActivity自己处理点击后的逻辑,避免错误创建Activity实例:
步骤1:给Adapter添加选中回调接口
在你的stockSuggestAdapter里新增一个回调接口,用于通知MainActivity用户选中了某个股票:
public class stockSuggestAdapter extends RecyclerView.Adapter<stockSuggestAdapter.ViewHolder> { // 原有成员变量... private final OnStockSelectedListener selectedListener; // 修改构造方法,接收回调实例 public stockSuggestAdapter(List<StockModelClass> data, Context context, OnStockSelectedListener listener) { this.stockModelClassesArray = data; this.context = context; this.selectedListener = listener; } // 定义回调接口 public interface OnStockSelectedListener { void onStockSelected(String name, String symbol); } // ViewHolder部分修改点击事件 public class ViewHolder extends RecyclerView.ViewHolder { // 原有控件初始化... public ViewHolder(@NonNull View itemView) { super(itemView); // 原有控件查找... itemView.setOnClickListener(v -> { int position = getAbsoluteAdapterPosition(); // 原有点击逻辑... itemOnClickListener.OnClickItemViewListener(position); // 获取当前选中的股票数据 StockModelClass selectedStock = stockModelClassesArray.get(position); // 通过回调通知MainActivity selectedListener.onStockSelected(selectedStock.getName(), selectedStock.getSymbol()); }); } } }
步骤2:在MainActivity实现回调并处理逻辑
让MainActivity实现上面的接口,直接操作自身的成员变量(包括suggestList):
public class MainActivity extends AppCompatActivity implements stockSuggestAdapter.OnStockSelectedListener { // 原有成员变量:suggestList、stockPriceList、stockPriceAdapter... @Override protected void onCreate(Bundle savedInstanceState) { // 原有初始化代码... // 修改Adapter初始化,传入当前Activity作为回调实例 suggestAdapter = new stockSuggestAdapter(stockModelClassesArray, MainActivity.this, this); suggestList.setAdapter(suggestAdapter); // 其他原有代码... } // 实现回调方法 @Override public void onStockSelected(String name, String symbol) { // 添加数据到股票列表 addStockToWatchList(name, symbol); // 直接隐藏suggestList(用成员变量,无需传参) suggestList.setVisibility(View.GONE); } // 单独封装添加逻辑,避免重复代码 private void addStockToWatchList(String name, String symbol) { String price = "$20"; // 直接往原有列表添加数据,不要重新创建列表 stockPriceList.add(new defualtWatchListModel(name, symbol, price)); // 通知Adapter数据更新 stockPriceAdapter.notifyItemInserted(stockPriceList.size() - 1); } }
步骤3:删除原有错误的StockPrice方法
把原来的StockPrice方法删掉,因为我们已经用回调和新的方法替代了它的功能,避免代码冗余。
这样修改后,既解决了空指针问题,也保证了数据能正确显示在stockPriceList里。
内容的提问来源于stack exchange,提问作者Prateek
相关产品推荐
相关产品推荐

