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

时间:2015-05-17 08:06:48

标签: android nullpointerexception menuitem

我正在处理RecylcerViewCardView。这些卡包含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。我有不同的方法,但仍然没有解决方案。

1 个答案:

答案 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发送一个意图或使用菜单项应该对信息进行分段。因此,适配器将无法直接访问菜单。