Android:以编程方式更新菜单项导致 NullPointerException
Android: Updating a menu item programmatically results in NullPointerException
我正在研究 RecylcerView
和 CardView
。这些卡片包含 ImageView。我还有一个 menu-item 被声明为一个动作,其标题设置为 0。我想要实现的是,当我单击图像时,它的位置应该添加到数组中, [= 的标题25=] 应该是数组的大小。
下面是我的 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>
下面是适配器 class 代码,我从中 运行 使用 onClickListner
代码:
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
。我各种方法都没有解决。
问题出在这一行。
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 或将包含应该对菜单项执行的信息的意图分段。所以在这种方式下适配器将无法直接访问菜单。
我正在研究 RecylcerView
和 CardView
。这些卡片包含 ImageView。我还有一个 menu-item 被声明为一个动作,其标题设置为 0。我想要实现的是,当我单击图像时,它的位置应该添加到数组中, [= 的标题25=] 应该是数组的大小。
下面是我的 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>
下面是适配器 class 代码,我从中 运行 使用 onClickListner
代码:
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
。我各种方法都没有解决。
问题出在这一行。
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 或将包含应该对菜单项执行的信息的意图分段。所以在这种方式下适配器将无法直接访问菜单。