Android:以编程方式更新菜单项导致 NullPointerException

Android: Updating a menu item programmatically results in NullPointerException

我正在研究 RecylcerViewCardView。这些卡片包含 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 或将包含应该对菜单项执行的信息的意图分段。所以在这种方式下适配器将无法直接访问菜单。