Android RecyclerView ViewHolder转到错误的自定义适配器

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

基于我实现的同一个示例,我为我的RecyclerView创建了一个自定义适配器。代码如下:

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);
    }
}

}
这是我第一次遇到这个错误,我试图解决它,但我只能用以下方法来修复它:

  • 删除菜单文件夹并仅使用AirportClass或
  • 删除AirportClass并仅使用MenuHolder
  • 有没有办法解决这个错误

    编辑:这是一个新代码,它没有给出以前的错误,但它保持在position==0ç的状态

    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);
        }
     }
    
    }