【问题标题】:Recyclerview search giving java.lang.IndexOutOfBoundsException: Invalid index 2, size is 2Recyclerview 搜索给出 java.lang.IndexOutOfBoundsException: Invalid index 2, size is 2
【发布时间】:2018-01-12 12:11:45
【问题描述】:

我正在这方面进行 recyclerview 搜索,我在谷歌上搜索了很多方法,但没有一个能正常工作。现在我正在实施一种大多数人建议实施的方法,但我得到了

java.lang.IndexOutOfBoundsException:

此外,这是我的适配器类:

public class CountryListAdapter extends RecyclerView.Adapter<CountryListAdapter.ViewHolder> implements Filterable {

ArrayList<CountryListModel> getDataAdapter;
private ArrayList<CountryListModel> mFilteredList;
Context context;
ImageLoader imageLoader1;
OnItemClickListner onItemClickListner;

public CountryListAdapter(ArrayList<CountryListModel> getDataAdapter, Context context){
    super();
    this.getDataAdapter = getDataAdapter;
    this.mFilteredList = getDataAdapter;
    this.context = context;

}

@Override
public CountryListAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_item_country_select, parent, false);

    CountryListAdapter.ViewHolder viewHolder = new CountryListAdapter.ViewHolder(v);

    return viewHolder;
}

@Override
public void onBindViewHolder(CountryListAdapter.ViewHolder holder, final int position) {


    imageLoader1 = ServerImageParseAdapter.getInstance(context).getImageLoader();
    holder.country_name.setText(mFilteredList.get(position).getCountry_name());
    Picasso.with(context).load("http://api.foodomia.pk/app/webroot/uploads/countries/"+mFilteredList.get(position).getCountry_name()+".png").
            fit().centerCrop()
            .placeholder(R.mipmap.ic_launcher)
            .error(R.drawable.unknown_deal).into(holder.country_image);

    holder.main_view.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            onItemClickListner.OnItemClicked(v, position);
        }
    });

}


@Override
public int getItemCount() {
    return getDataAdapter.size() ;
}

@Override
public Filter getFilter() {

    return new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence charSequence) {
            String charString = charSequence.toString();
            if (charString.isEmpty()) {
                mFilteredList = getDataAdapter;
            } else {
                ArrayList<CountryListModel> filteredList = new ArrayList<>();
                for (CountryListModel row : getDataAdapter) {

                    // name match condition. this might differ depending on your requirement
                    // here we are looking for name or phone number match
                    if (row.getCountry_name().toLowerCase().contains(charString.toLowerCase()) || row.getCountry_name().contains(charSequence)) {
                        filteredList.add(row);
                    }
                }

                mFilteredList = filteredList;
            }

            FilterResults filterResults = new FilterResults();
            filterResults.values = mFilteredList;
            return filterResults;
        }

        @Override
        protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
            mFilteredList = (ArrayList<CountryListModel>) filterResults.values;
            notifyDataSetChanged();
        }
    };

}


class ViewHolder extends RecyclerView.ViewHolder{

    public TextView country_name;
    public ImageView country_image;
    public RelativeLayout main_view;

    public ViewHolder(View itemView) {

        super(itemView);


        country_image = itemView.findViewById(R.id.flag_image);
        country_name = itemView.findViewById(R.id.country_name_tv);
        main_view = itemView.findViewById(R.id.main_view);




    }
}

public interface OnItemClickListner {
    void OnItemClicked(View view, int position);
}

public void setOnItemClickListner(OnItemClickListner onCardClickListner) {
    this.onItemClickListner = onCardClickListner;
}

}

【问题讨论】:

  • 您的列表仅包含 2 个元素,您正在尝试访问第 3 个元素,请检查。
  • 错误很明显......用你的代码:项目计数==未过滤计数+未过滤计数>过滤计数=>访问不存在索引的过滤列表
  • 你能指出错误在哪里吗?我应该在哪里进行更改
  • 项目数应等于您正在访问的列表的计数

标签: android search android-recyclerview indexoutofboundsexception


【解决方案1】:

首先。您使用的引用与全局列表相同。应该是这样的。

public CountryListAdapter(ArrayList<CountryListModel> getDataAdapter, Context context){
        super();
        this.getDataAdapter = getDataAdapter;
        this.mFilteredList = new ArrayList();
        this.mFilteredList.addAll(getDataAdapter);
        this.context = context;

    }

第二件事应该是filteredList的返回。

@Override
public int getItemCount() {
return mFilteredList.size() ;
}

【讨论】:

  • 非常感谢您拯救了我的一天。实际上错误是@Override public int getItemCount() { return mFilteredList.size() ; }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-12
  • 2018-08-01
  • 2020-02-01
  • 2016-03-30
  • 1970-01-01
  • 2020-03-16
  • 2018-04-07
相关资源
最近更新 更多