Android RecycleView搜索提供java.lang.IndexOutOfBoundsException:索引2无效,大小为2
我正在研究recyclerview搜索,在这方面,我用谷歌搜索了很多方法,但没有一种效果很好。现在,我正在实施一种大多数人都建议实施的方法,但我得到了 java.lang.IndexOutOfBoundsException: 此外,下面是我的适配器类: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 {
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() ;
}