无法调用RecyclerView适配器类中方法的技术问题求助
解决RecyclerView适配器自定义方法无法调用的问题
我来帮你排查下这个问题——你说调用不了适配器里的swapCursor方法,大概率是这几个常见原因之一:
1. 检查适配器变量的声明类型
这是最容易踩的坑:如果你把playerAdapter声明成了父类RecyclerView.Adapter类型,而不是你自定义的PlayerListRecyclerViewAdapter,编译器只会识别父类的方法,找不到你自定义的swapCursor。
错误示例:
// 父类类型声明,只能调用RecyclerView.Adapter自带的方法 RecyclerView.Adapter playerAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); playerAdapter = new PlayerListRecyclerViewAdapter(this,cursor, playerDataSet); playerRecyclerView.setAdapter(playerAdapter); }
正确做法:
把变量声明为你的自定义适配器类型:
// 用自定义适配器类声明变量,编译器能识别自定义方法 PlayerListRecyclerViewAdapter playerAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); playerAdapter = new PlayerListRecyclerViewAdapter(this,cursor, playerDataSet); playerRecyclerView.setAdapter(playerAdapter); }
修改后你就能直接调用playerAdapter.swapCursor(newCursor)了。
2. 确认适配器变量是类成员变量
如果你的playerAdapter是在某个方法(比如onCreate)里的局部变量,那在其他方法(比如数据更新回调)里就访问不到它。
错误示例:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 局部变量,只能在当前方法内访问 PlayerListRecyclerViewAdapter playerAdapter = new PlayerListRecyclerViewAdapter(this,cursor, playerDataSet); playerRecyclerView.setAdapter(playerAdapter); } // 其他方法里调用会报错:找不到playerAdapter变量 private void updatePlayerData(Cursor newCursor) { playerAdapter.swapCursor(newCursor); }
正确做法:
把playerAdapter声明为Activity/Fragment的成员变量:
// 类成员变量,整个类范围内都能访问 private PlayerListRecyclerViewAdapter playerAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); playerAdapter = new PlayerListRecyclerViewAdapter(this,cursor, playerDataSet); playerRecyclerView.setAdapter(playerAdapter); } private void updatePlayerData(Cursor newCursor) { if (playerAdapter != null) { playerAdapter.swapCursor(newCursor); } }
3. 检查swapCursor方法的访问修饰符
虽然你代码里写的是public,但还是要确认下有没有不小心写成private或者protected——只有public修饰的方法才能被外部类调用。
另外补充个小建议:在swapCursor方法最后最好调用notifyDataSetChanged()(或者用DiffUtil做局部更新),这样RecyclerView才会刷新显示新数据:
public void swapCursor(Cursor newCursor) { // Always close the previous mCursor first if (pCursor != null) pCursor.close(); pCursor = newCursor; if (newCursor != null) { // 通知RecyclerView更新数据 notifyDataSetChanged(); } }
内容的提问来源于stack exchange,提问作者user7221142
相关产品推荐
相关产品推荐

