【问题标题】:Null pointer Exception in method getItemCount [closed]方法getItemCount中的空指针异常[关闭]
【发布时间】:2015-09-01 17:47:06
【问题描述】:

我正在使用带有卡片视图和回收站视图的列表。我为列表添加了适配器并添加了 getItemCount 方法。我想为我的列表添加搜索功能。所以我也添加了一个过滤器。但是当我在搜索视图中输入时,我在 return ItemList.size(); 时得到一个异常;这条线..我错过了什么??

适配器

public class ItemAdapter  extends RecyclerView.Adapter<ListViewHolder> implements Filterable{

    public ItemsFilter itemFilter;
    ArrayList<Item> mStringFilterList;
    private ArrayList<Item> ItemList;
    private Context context;
    private MyItemClickListener mItemClickListener;
    private MyItemLongClickListener mItemLongClickListener;

        public ItemAdapter(Context context,ArrayList<Item> ItemList) {
           this.context= context;
            this.ItemList = ItemList;

        }

        @Override
        public ListViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
            View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_layout, null);
            ListViewHolder mh = new ListViewHolder(v);

            return mh;
        }

        @Override
        public void onBindViewHolder(final ListViewHolder ListViewHolder, int i) {
            Item Item = ItemList.get(i);
            ListViewHolder.textName.setText(Item.getItem_name());
            ListViewHolder.textDesc.setText(Item.getItem_desc());
            ListViewHolder.textQty.setText(Item.getItem_qty());
            ListViewHolder.textName.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                }
            });
        }

        @Override
        public int getItemCount() {
            return  ItemList.size();
        }
    public class ItemsFilter extends Filter {

            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                FilterResults results = new FilterResults();

                if (constraint != null && constraint.length() > 0) {
                    ArrayList<Item> filterList = new ArrayList<Item>();
                    for (int i = 0; i < mStringFilterList.size(); i++) {
                        if ((mStringFilterList.get(i).getItem_name())
                                .contains(constraint.toString())) {

                            Item item = new Item(mStringFilterList.get(i)
                                    .getItem_name(), mStringFilterList.get(i)
                                    .getItem_desc(), mStringFilterList.get(i)
                                    .getItem_qty());

                            filterList.add(item);
                        }
                    }
                    results.count = filterList.size();
                    results.values = filterList;
                } else {
                    results.count = mStringFilterList.size();
                    results.values = mStringFilterList;
                }
                return results;

            }

            @Override
            public void publishResults(CharSequence constraint,
                                       Filter.FilterResults results) {
                ItemList = (ArrayList<Item>) results.values;
                notifyDataSetChanged();
            }


        }
    @Override
    public Filter getFilter() {
        // return a filter that filters data based on a constraint

        if (itemFilter == null) {
            itemFilter = new ItemsFilter();
        }
        return itemFilter;
    }
}

片段

public class ViewStock extends Fragment  implements SearchView.OnQueryTextListener {
    final MainActivity act = (MainActivity) this.getActivity();


    public ViewStock() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View rootview = inflater.inflate(R.layout.fragment_view_stock, container, false);
        setHasOptionsMenu(true);
        act.array_data = new ArrayList<Item>();
        //   act.listview.setTextFilterEnabled(true);
       // act. = new ArrayList<Item>();
        // Context mCtx = getActivity().getApplicationContext();
        RecyclerView mRecyclerView = (RecyclerView)rootview.findViewById(R.id.my_recycler_view);
        LinearLayoutManager llm = new LinearLayoutManager(getActivity());
        llm.setOrientation(LinearLayoutManager.VERTICAL);
        mRecyclerView.setLayoutManager(llm);

        //   ItemAdapter adapter = new ItemAdapter(getActivity(), R.layout.list_item, act.arrayList);
        // listview.setAdapter(adapter);
        act.db = new DBHandler(getActivity());
        ArrayList<Item> item_array_from_db = act.db.Get_items();

        for (int i = 0; i < item_array_from_db.size(); i++) {

            int idno = item_array_from_db.get(i).getID();
            String name = item_array_from_db.get(i).getItem_name();
            String desc = item_array_from_db.get(i).getItem_desc();
            String qty = item_array_from_db.get(i).getItem_qty();
            Item cnt = new Item();
            cnt.setID(idno);
            cnt.setItem_name(name);
            cnt.setItem_desc(desc);
            cnt.setItem_qty(qty);

            act.array_data.add(cnt);
        }
        act.db.close();
        act.adapter=new ItemAdapter(getActivity(),act.array_data);
        mRecyclerView.setAdapter(act.adapter);

        return rootview;
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.menu_main, menu);

        final MenuItem item = menu.findItem(R.id.menu_search);
        final SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);
        searchView.setOnQueryTextListener(this);
    }

    @Override
    public boolean onQueryTextChange(String newText) {
        if (TextUtils.isEmpty(newText)) {
            act.adapter.getFilter().filter("");
        } else {
            act.adapter.getFilter().filter(newText.toString());
        }
        return true;
    }

    @Override
    public boolean onQueryTextSubmit(String query) {
        return false;
    }
}

public class Item {
    public int id;
    public String item_name;
    public String item_desc;
    public String item_qty;

    public Item(){}
    public Item(int id, String item_name, String item_desc, String item_qty) {
        super();
        this.item_name = item_name;
        this.item_desc = item_desc;
        this.item_qty = item_qty;
    }

    public Item(String item_name, String item_desc, String item_qty){
        this.item_name = item_name;
        this.item_desc=item_desc;
        this.item_qty = item_qty;
    }

    public int getID(){
        return id;
    }

    public void setID(int id){
        this.id= id;
    }
    public String getItem_name(){
        return item_name;
    }

    public void setItem_name(String item_name)
    {
        this.item_name=item_name;
    }

    public String getItem_desc()
    {
        return  item_desc;
    }
    public  void setItem_desc(String item_desc)
    {
        this.item_desc=item_desc;
    }
    public String getItem_qty()
    {
        return  item_qty;
    }
    public void setItem_qty(String item_qty) {
        this.item_qty = item_qty;
    }
}

【问题讨论】:

  • 不要只是粘贴代码。 NullPointerExcepton 实际上在哪里发生提及它 - 通过评论。
  • 哪一行抛出异常?
  • 我已经提到了.. return ItemList.size(); --------此行抛出异常
  • 如果它抛出异常,则意味着ItemList 为空。你是在调用getItemCount 之前调用构造函数ItemAdapter(并将非空ArrayList 传递给它)吗?
  • public ItemAdapter(Context context,ArrayList ItemList) { this.context= context; this.ItemList = 项目列表; } --------------------------------------这是构造函数

标签: java android filter android-recyclerview


【解决方案1】:

ItemList 在某处被设置为null。防止这种情况的一种方法是更改​​您的 getItemCount 方法以在列表为空时返回 0:

int getItemCount(){
    return  ItemList == null ? 0 : ItemList.size();
}

【讨论】:

  • 我没有任何列表可供搜索..
  • 在act.adapter=new ItemAdapter(getActivity(),act.array_data) 中,能否验证act.array_data 不为空。
  • Item cnt = new Item(); cnt.setID(idno); cnt.setItem_name(名称); cnt.setItem_desc(desc); cnt.setItem_qty(数量); act.array_data.add(cnt);---------- 是的,因为 act.array_data 包含列表,因为我可以查看列表中的项目。
【解决方案2】:

只需像这样初始化您的 ItemList,

  private ArrayList<Item> ItemList = new ArrayList<Item>();

或者,在您的 getItemCount() 中添加一个检查

    @Override
    public int getItemCount() {
        If (ItemList == null)
           return 0;
        else
           return  ItemList.size();
    }

已编辑

    @Override
    public int getItemCount() {
        if (ItemList == null)
           return 0;
        else
           return  ItemList.size();
    }

【讨论】:

  • 我不知道这是否是这里的目标。如果您查看构造函数,您会注意到它以ArrayList&lt;Item&gt; 作为参数,然后他将ItemList 变量链接到
  • 该 Argument 中的 ItemList 可能为 null,并且它永远无法真正初始化正在使用的 ItemList。
  • 正是我的想法。因此,与其创建一个新的ArrayList,OP 应该确保检查他传递给他的构造函数的内容是否为空,而不是仅仅创建一个新的空ArrayList 并假设它会被覆盖。
  • @dhun --- 语法对吗??
  • if 应该是小写的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-21
  • 2011-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多