Android RecycleView搜索提供java.lang.IndexOutOfBoundsException:索引2无效,大小为2

Android RecycleView搜索提供java.lang.IndexOutOfBoundsException:索引2无效,大小为2,android,search,android-recyclerview,indexoutofboundsexception,Android,Search,Android Recyclerview,Indexoutofboundsexception,我正在研究recyclerview搜索,在这方面,我用谷歌搜索了很多方法,但没有一种效果很好。现在,我正在实施一种大多数人都建议实施的方法,但我得到了 java.lang.IndexOutOfBoundsException: 此外,下面是我的适配器类: public class CountryListAdapter extends RecyclerView.Adapter<CountryListAdapter.ViewHolder> implements Filterable {

我正在研究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;
}
公共类CountryListAdapter扩展了RecyclerView。适配器实现可过滤{
ArrayList getDataAdapter;
私人阵列列表mFilteredList;
语境;
图像加载器图像加载器1;
OnItemClickListner OnItemClickListner;
公共CountryListAdapter(ArrayList getDataAdapter,上下文){
超级();
this.getDataAdapter=getDataAdapter;
this.mFilteredList=getDataAdapter;
this.context=上下文;
}
@凌驾
public CountryListAdapter.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
视图v=LayoutInflater.from(parent.getContext()).flate(R.layout.row\u item\u country\u select,parent,false);
CountryListAdapter.ViewHolder ViewHolder=新CountryListAdapter.ViewHolder(v);
返回视图持有者;
}
@凌驾
BindViewHolder上的公共无效(CountryListAdapter.ViewHolder,最终整数位置){
imageLoader1=ServerImageParseAdapter.getInstance(上下文).getImageLoader();
holder.country_name.setText(mFilteredList.get(position.getCountry_name());
毕加索.with(context).load(“http://api.foodomia.pk/app/webroot/uploads/countries/“+mFilteredList.get(position.getCountry_name()+”.png”)。
fit().centerCrop()
.占位符(R.mipmap.ic_启动器)
.错误(R.drawable.unknown_deal)。进入(持有者国家/地区图像);
holder.main\u view.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
onItemClickListner.OnItemClicked(v,位置);
}
});
}
@凌驾
public int getItemCount(){
返回getDataAdapter.size();
}
@凌驾
公共过滤器getFilter(){
返回新筛选器(){
@凌驾
受保护过滤器结果执行过滤(CharSequence CharSequence){
String charString=charSequence.toString();
if(charString.isEmpty()){
mFilteredList=getDataAdapter;
}否则{
ArrayList filteredList=新建ArrayList();
对于(CountryListModel行:getDataAdapter){
//名称匹配条件。这可能因您的要求而异
//在这里,我们正在寻找姓名或电话号码匹配
if(row.getCountry_name().toLowerCase()包含(charString.toLowerCase())| row.getCountry_name()包含(charSequence)){
filteredList.add(行);
}
}
mFilteredList=filteredList;
}
FilterResults FilterResults=新的FilterResults();
filterResults.values=mFilteredList;
返回过滤器结果;
}
@凌驾
受保护的无效发布结果(CharSequence CharSequence、FilterResults FilterResults){
mFilteredList=(ArrayList)filterResults.values;
notifyDataSetChanged();
}
};
}
类ViewHolder扩展了RecyclerView.ViewHolder{
公共文本查看国家/地区名称;
公众形象查看国家形象;
公共关系主视图;
公共视图持有者(视图项视图){
超级(项目视图);
country\u image=itemView.findviewbyd(R.id.flag\u image);
country\u name=itemView.findviewbyd(R.id.country\u name\u tv);
main\u视图=itemView.findviewbyd(R.id.main\u视图);
}
}
公共接口列表器{
单击无效(视图,int位置);
}
公共无效setOnItemClickListner(OnItemClickListner onCardClickListner){
this.onItemClickListner=onCardClickListner;
}

}

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

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

    }

您的列表仅包含2个元素,您正在尝试访问第3个元素。请检查。错误很明显。。。代码为:项目计数==未筛选计数+未筛选计数>筛选计数=>使用不存在的索引访问筛选列表。请指出错误所在。我应该在哪里进行更改?我的计数应该等于您正在访问的列表的计数。非常感谢您救了我一天。实际上,错误是@Override public int getItemCount(){return mFilteredList.size();}
@Override
public int getItemCount() {
return mFilteredList.size() ;
}