Android RecyclerView ViewHolder转到错误的自定义适配器
基于我实现的同一个示例,我为我的RecyclerView创建了一个自定义适配器。代码如下:Android RecyclerView ViewHolder转到错误的自定义适配器,android,android-recyclerview,realm,android-adapter,Android,Android Recyclerview,Realm,Android Adapter,基于我实现的同一个示例,我为我的RecyclerView创建了一个自定义适配器。代码如下: public class AirportsAdapter extends RealmRecyclerViewAdapter<Airport,RecyclerView.ViewHolder> implements Filterable { Context context; public static final int FILTER_MODE_A = 0; public static final
public class AirportsAdapter extends RealmRecyclerViewAdapter<Airport,RecyclerView.ViewHolder> implements Filterable
{
Context context;
public static final int FILTER_MODE_A = 0;
public static final int FILTER_MODE_B = 1;
OrderedRealmCollection<Airport> listAirports;
RealmResults<Airport> nearby;
Realm realm;
int NEARBY = 0;
int nearbySize;
boolean COUNTRY = false;
int ALL = 0;
public AirportsAdapter(Context context, OrderedRealmCollection<Airport>airports, RealmResults<Airport> nearby, Realm realm)
{
super(context,airports, true);
this.context = context;
this.listAirports = airports;
this.realm = realm;
this.nearby = nearby;
nearbySize = nearby.size();
ALL = ALL + nearbySize;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
//sono tutti uguali no?
//sisi l'avevo messo così solo per non fare un mega or
if(viewType == 0 || viewType== ALL || (viewType == 0 && (COUNTRY)))
{
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.input_custom_item, parent, false);
MenuHolder menuHolder = new MenuHolder(view);
return menuHolder;
}
else
{
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.airport_show, parent, false);
AirportClass holder = new AirportClass(view);
return holder;
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position)
{
if(position==0)
{
MenuHolder mHolder = (MenuHolder)holder;
mHolder.type.setText("Nearby");
mHolder.type.setTypeface(Typeface.createFromAsset(context.getAssets(),"fonts/Avenir-Medium.ttf"),Typeface.BOLD);
}
else if(position == ALL)
{
MenuHolder mHolder = (MenuHolder)holder;
mHolder.type.setText("All");
mHolder.type.setTypeface(Typeface.createFromAsset(context.getAssets(),"fonts/Avenir-Medium.ttf"),Typeface.BOLD);
}
else if(position == 0 && (COUNTRY))
{
MenuHolder mHolder = (MenuHolder)holder;
mHolder.type.setText("Country");
mHolder.type.setTypeface(Typeface.createFromAsset(context.getAssets(),"fonts/Avenir-Medium.ttf"),Typeface.BOLD);
}
else
{
AirportClass mHolder = (AirportClass) holder;
Airport airport = listAirports.get(position);
String country = airport.getIsoCountry().toLowerCase();
if (country.equals("do"))
country = "dom";
int imgID = context.getResources().getIdentifier(country, "drawable", context.getPackageName());
Glide.with(context).load(imgID).into(mHolder.image);
mHolder.des.setText(airport.getIdent());
mHolder.name.setText(airport.getName());
mHolder.des.setTypeface(Typeface.createFromAsset(context.getAssets(), "fonts/Avenir-Book.ttf"), Typeface.BOLD);
mHolder.name.setTypeface(Typeface.createFromAsset(context.getAssets(), "fonts/Avenir-Book.ttf"));
}
}
public void filterResults(String text, int filterMode)
{
String txt = text;
text = text == null ? null : text.toLowerCase().trim();
if(text == null || "".equals(text))
{
listAirports = realm.where(Airport.class).findAll();
}
else
{
if(filterMode == FILTER_MODE_A)
{
listAirports = realm.where(Airport.class).contains("name", text, Case.INSENSITIVE).findAll();
COUNTRY = false;
}
if(filterMode == FILTER_MODE_B)
{
System.out.print(text);
COUNTRY = true;
Countries country = realm.where(Countries.class).equalTo("name",txt).findFirst();
listAirports = realm.where(Airport.class).equalTo("isoCountry", country.getCode(), Case.INSENSITIVE).findAll();
}
}
updateData(listAirports);
}
public Filter getFilter(int filterMode)
{
AirportFilter filter = new AirportFilter(this, filterMode);
return filter;
}
@Override
public Filter getFilter() {
return null;
}
private class AirportFilter extends Filter
{
private final AirportsAdapter adapter;
private int filterMode;
private AirportFilter(AirportsAdapter adapter, int filterMode)
{
super();
this.adapter = adapter;
this.filterMode = filterMode;
}
@Override
protected FilterResults performFiltering(CharSequence constraint)
{
if (filterMode == FILTER_MODE_A)
return new Filter.FilterResults();
if (filterMode == FILTER_MODE_B)
return new Filter.FilterResults();
return new Filter.FilterResults();
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results)
{
adapter.filterResults(constraint.toString(),filterMode);
}
}
private class AirportClass extends RecyclerView.ViewHolder
{
TextView name, des;
ImageView image;
public AirportClass(View itemView)
{
super(itemView);
name = (TextView)itemView.findViewById(R.id.name);
des = (TextView)itemView.findViewById(R.id.item);
image = (ImageView)itemView.findViewById(R.id.color);
}
}
private class MenuHolder extends RecyclerView.ViewHolder
{
TextView type;
public MenuHolder(View itemView)
{
super(itemView);
type = (TextView)itemView.findViewById(R.id.init);
}
}
}
这是我第一次遇到这个错误,我试图解决它,但我只能用以下方法来修复它:
public class AirportsAdapter extends RealmRecyclerViewAdapter<Airport,RecyclerView.ViewHolder> implements Filterable
{
Context context;
public static final int FILTER_MODE_A = 0;
public static final int FILTER_MODE_B = 1;
OrderedRealmCollection<Airport> listAirports;
RealmResults<Airport> nearby;
Realm realm;
int NEARBY = 0;
int nearbySize;
boolean COUNTRY = false;
int ALL = 0;
public AirportsAdapter(Context context, OrderedRealmCollection<Airport>airports, RealmResults<Airport> nearby, Realm realm)
{
super(context,airports, true);
this.context = context;
this.listAirports = airports;
this.realm = realm;
this.nearby = nearby;
nearbySize = nearby.size();
ALL = ALL + nearbySize;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
//sono tutti uguali no?
//sisi l'avevo messo così solo per non fare un mega or
if(viewType == NEARBY )
{
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.input_custom_item, parent, false);
MenuHolder menuHolder = new MenuHolder(view);
return menuHolder;
}
else
{
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.airport_show, parent, false);
AirportClass holder = new AirportClass(view);
return holder;
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position)
{
if(getItemViewType(position)==NEARBY)
{
Log.i("ivt",String.valueOf(position));
MenuHolder mHolder = (MenuHolder)holder;
mHolder.type.setText("Nearby");
mHolder.type.setTypeface(Typeface.createFromAsset(context.getAssets(),"fonts/Avenir-Medium.ttf"),Typeface.BOLD);
}
/* else if(getItemViewType(position) == ALL)
{
MenuHolder mHolder = (MenuHolder)holder;
mHolder.type.setText("All");
mHolder.type.setTypeface(Typeface.createFromAsset(context.getAssets(),"fonts/Avenir-Medium.ttf"),Typeface.BOLD);
}
else if(getItemViewType(position) == 0 && (COUNTRY))
{
MenuHolder mHolder = (MenuHolder)holder;
mHolder.type.setText("Country");
mHolder.type.setTypeface(Typeface.createFromAsset(context.getAssets(),"fonts/Avenir-Medium.ttf"),Typeface.BOLD);
}
*/
else
{
AirportClass mHolder = (AirportClass) holder;
Airport airport = listAirports.get(position);
String country = airport.getIsoCountry().toLowerCase();
if (country.equals("do"))
country = "dom";
int imgID = context.getResources().getIdentifier(country, "drawable", context.getPackageName());
Glide.with(context).load(imgID).into(mHolder.image);
mHolder.des.setText(airport.getIdent());
mHolder.name.setText(airport.getName());
mHolder.des.setTypeface(Typeface.createFromAsset(context.getAssets(), "fonts/Avenir-Book.ttf"), Typeface.BOLD);
mHolder.name.setTypeface(Typeface.createFromAsset(context.getAssets(), "fonts/Avenir-Book.ttf"));
}
}
@Override
public int getItemViewType(int position)
{
return super.getItemViewType(position);
}
@Override
public int getItemCount()
{
if(nearbySize == 0)
{
return 1 + listAirports.size();
}
else
{
return 2 + nearbySize + listAirports.size();
}
}
public void filterResults(String text, int filterMode)
{
String txt = text;
text = text == null ? null : text.toLowerCase().trim();
if(text == null || "".equals(text))
{
listAirports = realm.where(Airport.class).findAll();
}
else
{
if(filterMode == FILTER_MODE_A)
{
listAirports = realm.where(Airport.class).contains("name", text, Case.INSENSITIVE).findAll();
COUNTRY = false;
}
if(filterMode == FILTER_MODE_B)
{
System.out.print(text);
COUNTRY = true;
Countries country = realm.where(Countries.class).equalTo("name",txt).findFirst();
listAirports = realm.where(Airport.class).equalTo("isoCountry", country.getCode(), Case.INSENSITIVE).findAll();
}
}
updateData(listAirports);
}
public Filter getFilter(int filterMode)
{
AirportFilter filter = new AirportFilter(this, filterMode);
return filter;
}
@Override
public Filter getFilter() {
return null;
}
private class AirportFilter extends Filter
{
private final AirportsAdapter adapter;
private int filterMode;
private AirportFilter(AirportsAdapter adapter, int filterMode)
{
super();
this.adapter = adapter;
this.filterMode = filterMode;
}
@Override
protected FilterResults performFiltering(CharSequence constraint)
{
if (filterMode == FILTER_MODE_A)
return new Filter.FilterResults();
if (filterMode == FILTER_MODE_B)
return new Filter.FilterResults();
return new Filter.FilterResults();
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results)
{
adapter.filterResults(constraint.toString(),filterMode);
}
}
private class AirportClass extends RecyclerView.ViewHolder
{
TextView name, des;
ImageView image;
public AirportClass(View itemView)
{
super(itemView);
name = (TextView)itemView.findViewById(R.id.name);
des = (TextView)itemView.findViewById(R.id.item);
image = (ImageView)itemView.findViewById(R.id.color);
}
}
private class MenuHolder extends RecyclerView.ViewHolder
{
TextView type;
public MenuHolder(View itemView)
{
super(itemView);
type = (TextView)itemView.findViewById(R.id.init);
}
}
}
公共类AirportsAdapter扩展RealmRecyclServiceAdapter实现可过滤
{
语境;
公共静态最终整型过滤器\u模式\u A=0;
公共静态最终整型过滤器模式=1;
OrderedRealmCollection列表机场;
附近的真实结果;
境界;
int=0;
int nearbySize;
布尔国家=假;
int ALL=0;
公共AirportsAdapter(上下文上下文、OrderedRealmCollectionairports、RealmResults Nearly、Realm领域)
{
超级(上下文、机场、真实);
this.context=上下文;
this.listAirports=机场;
this.realm=领域;
this.nearly=附近;
nearbySize=nearest.size();
全部=全部+近尺寸;
}
@凌驾
public RecyclerView.ViewHolder onCreateViewHolder(视图组父级,int-viewType)
{
//索诺·图蒂·乌古利没有?
//sisi l'avevo messo cosìsolo每辆非豪华轿车或
如果(viewType==附近)
{
View=LayoutFlater.from(parent.getContext()).flate(R.layout.input\u custom\u项目,parent,false);
MenuHolder MenuHolder=新MenuHolder(视图);
返回menuHolder;
}
其他的
{
视图=LayoutFlater.from(parent.getContext()).flate(R.layout.airport\u show,parent,false);
AirportClass holder=新的AirportClass(视图);
报税表持有人;
}
}
@凌驾
BindViewHolder上的公共无效(RecyclerView.ViewHolder,int位置)
{
if(getItemViewType(位置)=附近)
{
Log.i(“ivt”,String.valueOf(position));
MenuHolder mHolder=(MenuHolder)持有人;
mHolder.type.setText(“附近”);
mHolder.type.setTypeface(Typeface.createFromAsset(context.getAssets(),“font/Avenir Medium.ttf”),Typeface.BOLD);
}
/*else if(getItemViewType(position)==ALL)
{
MenuHolder mHolder=(MenuHolder)持有人;
mHolder.type.setText(“全部”);
mHolder.type.setTypeface(Typeface.createFromAsset(context.getAssets(),“font/Avenir Medium.ttf”),Typeface.BOLD);
}
else if(getItemViewType(位置)==0&&(国家))
{
MenuHolder mHolder=(MenuHolder)持有人;
mHolder.type.setText(“国家”);
mHolder.type.setTypeface(Typeface.createFromAsset(context.getAssets(),“font/Avenir Medium.ttf”),Typeface.BOLD);
}
*/
其他的
{
AirportClass mHolder=(AirportClass)持有人;
Airport Airport=列表airports.get(位置);
字符串country=airport.getIsoCountry().toLowerCase();
如果(国家等于(“do”))
country=“dom”;
int imgID=context.getResources().getIdentifier(国家,“可绘制”,context.getPackageName());
Glide.with(context.load(imgID.into)(mHolder.image);
mHolder.des.setText(airport.getIdent());
mHolder.name.setText(airport.getName());
mHolder.des.setTypeface(Typeface.createFromAsset(context.getAssets(),“font/Avenir Book.ttf”),Typeface.BOLD);
mHolder.name.setTypeface(Typeface.createFromAsset(context.getAssets(),“font/Avenir Book.ttf”);
}
}
@凌驾
public int getItemViewType(int位置)
{
返回super.getItemViewType(位置);
}
@凌驾
public int getItemCount()
{
if(nearbySize==0)
{
返回1+listAirports.size();
}
其他的
{
返回2+nearbySize+listAirports.size();
}
}
public void filterResults(字符串文本,int filterMode)
{
字符串txt=文本;
text=text==null?null:text.toLowerCase().trim();
如果(text==null | |“”.equals(text))
{
listAirports=realm.where(Airport.class).findAll();
}
其他的
{
如果(filterMode==过滤器模式A)
{
listAirports=realm.where(Airport.class).contains(“名称”,文本,不区分大小写).findAll();
国家=假;
}
if(filterMode==过滤器模式)
{
系统输出打印(文本);
国家=正确;
Countries country=realm.where(Countries.class).equalTo(“name”,txt).findFirst();
listAirports=realm.where(Airport.class).equalTo(“isoCountry”,country.getCode(),不区分大小写).findAll();
}
}
更新数据(列表机场);
}
公共筛选器getFilter(int filterMode)
{
AirportFilter filter=新的AirportFilter(此,filterMode);
回流过滤器;
}
@凌驾
公共过滤器getFilter(){
返回null;
}
私有类AirportFilter扩展了筛选器
{
专用最终机场适配器;
私有int filterMode;
专用AirportFilter(AirportsAdapter适配器,int filterMode)
{
超级();
this.adapter=适配器;
this.filterMode=filterMode;
}
@凌驾
受保护的筛选器结果性能筛选(CharSequence约束)
{
如果(filterMode==过滤器模式A)
返回新筛选器。FilterResults();
if(filterMode==过滤器模式)
返回新筛选器。FilterResults();
返回新筛选器。FilterResults();
}
@凌驾
受保护的void publishResults(CharSequence约束、FilterResults结果)
{
adapter.filterResults(constraint.toString(),filterMode);
}
}
私有类AirportClass扩展了RecyclerView.ViewHolder
{
文本视图名称,des;
图像视图图像;
公共机场类别(查看项目视图)
{
超级(项目视图);
name=(TextView)itemView.findViewById(R.id.name);
des=(TextView)itemView.findViewById(R.id.item);
image=(ImageView)itemView.findViewById(R.id.color);
}
}
私有类MenuHolder扩展
public class AirportsAdapter extends RealmRecyclerViewAdapter<Airport,RecyclerView.ViewHolder> implements Filterable
{
Context context;
public static final int FILTER_MODE_A = 0;
public static final int FILTER_MODE_B = 1;
OrderedRealmCollection<Airport> listAirports;
RealmResults<Airport> nearby;
Realm realm;
int NEARBY = 0;
int nearbySize;
boolean COUNTRY = false;
int ALL = 0;
public AirportsAdapter(Context context, OrderedRealmCollection<Airport>airports, RealmResults<Airport> nearby, Realm realm)
{
super(context,airports, true);
this.context = context;
this.listAirports = airports;
this.realm = realm;
this.nearby = nearby;
nearbySize = nearby.size();
ALL = ALL + nearbySize;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
//sono tutti uguali no?
//sisi l'avevo messo così solo per non fare un mega or
if(viewType == NEARBY )
{
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.input_custom_item, parent, false);
MenuHolder menuHolder = new MenuHolder(view);
return menuHolder;
}
else
{
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.airport_show, parent, false);
AirportClass holder = new AirportClass(view);
return holder;
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position)
{
if(getItemViewType(position)==NEARBY)
{
Log.i("ivt",String.valueOf(position));
MenuHolder mHolder = (MenuHolder)holder;
mHolder.type.setText("Nearby");
mHolder.type.setTypeface(Typeface.createFromAsset(context.getAssets(),"fonts/Avenir-Medium.ttf"),Typeface.BOLD);
}
/* else if(getItemViewType(position) == ALL)
{
MenuHolder mHolder = (MenuHolder)holder;
mHolder.type.setText("All");
mHolder.type.setTypeface(Typeface.createFromAsset(context.getAssets(),"fonts/Avenir-Medium.ttf"),Typeface.BOLD);
}
else if(getItemViewType(position) == 0 && (COUNTRY))
{
MenuHolder mHolder = (MenuHolder)holder;
mHolder.type.setText("Country");
mHolder.type.setTypeface(Typeface.createFromAsset(context.getAssets(),"fonts/Avenir-Medium.ttf"),Typeface.BOLD);
}
*/
else
{
AirportClass mHolder = (AirportClass) holder;
Airport airport = listAirports.get(position);
String country = airport.getIsoCountry().toLowerCase();
if (country.equals("do"))
country = "dom";
int imgID = context.getResources().getIdentifier(country, "drawable", context.getPackageName());
Glide.with(context).load(imgID).into(mHolder.image);
mHolder.des.setText(airport.getIdent());
mHolder.name.setText(airport.getName());
mHolder.des.setTypeface(Typeface.createFromAsset(context.getAssets(), "fonts/Avenir-Book.ttf"), Typeface.BOLD);
mHolder.name.setTypeface(Typeface.createFromAsset(context.getAssets(), "fonts/Avenir-Book.ttf"));
}
}
@Override
public int getItemViewType(int position)
{
return super.getItemViewType(position);
}
@Override
public int getItemCount()
{
if(nearbySize == 0)
{
return 1 + listAirports.size();
}
else
{
return 2 + nearbySize + listAirports.size();
}
}
public void filterResults(String text, int filterMode)
{
String txt = text;
text = text == null ? null : text.toLowerCase().trim();
if(text == null || "".equals(text))
{
listAirports = realm.where(Airport.class).findAll();
}
else
{
if(filterMode == FILTER_MODE_A)
{
listAirports = realm.where(Airport.class).contains("name", text, Case.INSENSITIVE).findAll();
COUNTRY = false;
}
if(filterMode == FILTER_MODE_B)
{
System.out.print(text);
COUNTRY = true;
Countries country = realm.where(Countries.class).equalTo("name",txt).findFirst();
listAirports = realm.where(Airport.class).equalTo("isoCountry", country.getCode(), Case.INSENSITIVE).findAll();
}
}
updateData(listAirports);
}
public Filter getFilter(int filterMode)
{
AirportFilter filter = new AirportFilter(this, filterMode);
return filter;
}
@Override
public Filter getFilter() {
return null;
}
private class AirportFilter extends Filter
{
private final AirportsAdapter adapter;
private int filterMode;
private AirportFilter(AirportsAdapter adapter, int filterMode)
{
super();
this.adapter = adapter;
this.filterMode = filterMode;
}
@Override
protected FilterResults performFiltering(CharSequence constraint)
{
if (filterMode == FILTER_MODE_A)
return new Filter.FilterResults();
if (filterMode == FILTER_MODE_B)
return new Filter.FilterResults();
return new Filter.FilterResults();
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results)
{
adapter.filterResults(constraint.toString(),filterMode);
}
}
private class AirportClass extends RecyclerView.ViewHolder
{
TextView name, des;
ImageView image;
public AirportClass(View itemView)
{
super(itemView);
name = (TextView)itemView.findViewById(R.id.name);
des = (TextView)itemView.findViewById(R.id.item);
image = (ImageView)itemView.findViewById(R.id.color);
}
}
private class MenuHolder extends RecyclerView.ViewHolder
{
TextView type;
public MenuHolder(View itemView)
{
super(itemView);
type = (TextView)itemView.findViewById(R.id.init);
}
}
}