我正在处理RecylcerView
和CardView
。这些卡包含ImageView。我还有一个声明为动作的菜单项,其标题设置为0.我想要实现的是当我点击图像时,它的位置应该被添加到一个数组中,菜单项的标题应该是是数组的大小。
下面是我的menu.xml代码:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity">
...
<item
android:id="@+id/action_down_list"
android:title="@string/action_down_list"
android:orderInCategory="100"
app:showAsAction="withText|always"
android:icon="@drawable/ic_action_download" />
</menu>
以下是我运行onClickListner
代码的Adapter类代码:
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {
List<String> abc = new ArrayList<String>();
...
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
...
viewHolder.imgView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
String img_id = images.get(viewHolder.getAdapterPosition());
MenuItem dl_menu = (MenuItem) view.findViewById(R.id.action_down_list);
abc.add(img_id);
dl_menu.setTitle(Integer.toString(abc.size()));
return true;
}
});
}
}
但是当我运行我的程序时,它会给出java.lang.NullPointerException
。我有不同的方法,但仍然没有解决方案。
答案 0 :(得分:0)
问题出在这一行。
MenuItem dl_menu = (MenuItem) view.findViewById(R.id.action_down_list);
您试图在视图中找到没有它的菜单项。没有简单的方法可以从适配器访问菜单。
在您的情况下最简单的方法是在适配器中创建菜单的设置方法
public void setMenu(Menu menu){
this.menu = menu;
}
并在onCreateOptionsMenu
回调中为您的适配器调用它,确保您的适配器在它之前初始化。之后你可以写:
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {
List<String> abc = new ArrayList<String>();
Menu menu;
...
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
...
viewHolder.imgView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
String img_id = images.get(viewHolder.getAdapterPosition());
MenuItem dl_menu = menu.findItem(R.id.action_down_list);
abc.add(img_id);
dl_menu.setTitle(Integer.toString(abc.size()));
return true;
}
});
但从我的角度来看,首选的方法是使用像LocalBroadcastManager这样的smth来向Activity发送一个意图或使用菜单项应该对信息进行分段。因此,适配器将无法直接访问菜单。