Android 不兼容类型:无法将viewholder强制转换为imageviewholder

Android 不兼容类型:无法将viewholder强制转换为imageviewholder,android,android-recyclerview,incompatibletypeerror,Android,Android Recyclerview,Incompatibletypeerror,我正在遵循一个RecyclerView示例,我有这个错误 incompatible types: cannot cast viewholder to imageviewholder 关于这个代码 case TYPE_IMAGE: ImageViewHolder imageViewHolder = (ImageViewHolder) holder; 这是我的完整代码(已编辑) 您应该更改: public class MyAdapter extends Recycler

我正在遵循一个RecyclerView示例,我有这个错误

incompatible types: cannot cast viewholder to imageviewholder
关于这个代码

case TYPE_IMAGE:
            ImageViewHolder imageViewHolder = (ImageViewHolder) holder;
这是我的完整代码(已编辑)

您应该更改:

 public class MyAdapter extends RecyclerView.Adapter<MyAdapter.TextViewHolder> 
用于:

然后更改onBindViewHolder方法:

 @Override
 public void onBindViewHolder(TextViewHolder TextViewHolder, int position) 
用于:

别忘了设置您的取景器类型:

   @Override
   public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent,
                                               int viewType){
    switch (viewType) {

       case TYPE_IMAGE: {
            View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.XXX, parent, false);
            return new ImageViewHolder(itemView);
            }
       case TYPE_GROUP: {
            View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.XXX, parent, false);
            return new TextViewHolder(itemView);
           }
      }
此文件已更新:

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private ArrayList<String> mDataset;

    public class ImageViewHolder extends RecyclerView.ViewHolder {
        //ImageView mImage;
        public TextView txtHeader;
        public TextView txtFooter;
        public ImageViewHolder(View itemView) {
            super (itemView);
            txtHeader = (TextView) itemView.findViewById(R.id.firstLine1);
            txtFooter = (TextView) itemView.findViewById(R.id.secondLine1);
        }
    }

    // Provide a reference to the views for each data item
    // Complex data items may need more than one view per item, and
    // you provide access to all the views for a data item in a view holder
    public class TextViewHolder extends RecyclerView.ViewHolder {
        // each data item is just a string in this case
        public TextView txtHeader;
        public TextView txtFooter;

        public TextViewHolder(View v) {
            super(v);
            txtHeader = (TextView) v.findViewById(R.id.firstLine);
            txtFooter = (TextView) v.findViewById(R.id.secondLine);
        }
    }

    public void add(int position, String item) {
        mDataset.add(position, item);
        notifyItemInserted(position);
    }

    public void remove(String item) {
        int position = mDataset.indexOf(item);
        mDataset.remove(position);
        notifyItemRemoved(position);
    }

    // Provide a suitable constructor (depends on the kind of dataset)
    public MyAdapter(ArrayList<String> myDataset) {
        mDataset = myDataset;
    }

    // Create new views (invoked by the layout manager)
    @Override
    public RecyclerView.ViewHolder  onCreateViewHolder(ViewGroup parent,
                                                       int viewType) {
        if (viewType == TYPE_IMAGE) {
            // create a new view
            View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.rowlayout, parent, false);
            // set the view's size, margins, paddings and layout parameters
            ImageViewHolder vh = new ImageViewHolder(v);
            return vh;
        } else {
            // create a new view
            View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.rowlayout, parent, false);
            // set the view's size, margins, paddings and layout parameters
            TextViewHolder vh = new TextViewHolder(v);
            return vh;
        }
    }

    private static final int TYPE_IMAGE = 1;
    private static final int TYPE_GROUP = 2;

    @Override
    public int getItemViewType(int position) {
        // here your custom logic to choose the view type
        return position == 0 ? TYPE_IMAGE : TYPE_GROUP;
    }

    // Replace the contents of a view (invoked by the layout manager)
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder TextViewHolder, int position) {

        switch (TextViewHolder.getItemViewType()) {

            case TYPE_IMAGE:
                ImageViewHolder imageViewHolder = (ImageViewHolder) TextViewHolder;
                // imageViewHolder.mImage.setImageResource(...);
                final String namev = mDataset.get(position);
                imageViewHolder.txtHeader.setText(mDataset.get(position));
                imageViewHolder.txtHeader.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        remove(namev);
                    }
                });

                break;

            case TYPE_GROUP:
                TextViewHolder viewHolder = (TextViewHolder) TextViewHolder;
                //  viewHolder.txtHeader.setText(...)
                final String name = mDataset.get(position);
                viewHolder.txtHeader.setText(mDataset.get(position));
                viewHolder.txtHeader.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        remove(name);
                    }
                });

                viewHolder.txtFooter.setText("Footer: " + mDataset.get(position));

                break;
        }
/*
        // - get element from your dataset at this position
        // - replace the contents of the view with that element
        final String name = mDataset.get(position);
        holder.txtHeader.setText(mDataset.get(position));
        holder.txtHeader.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                remove(name);
            }
        });

        holder.txtFooter.setText("Footer: " + mDataset.get(position));
*/
    }

    // Return the size of your dataset (invoked by the layout manager)
    @Override
    public int getItemCount() {
        return mDataset.size();
    }

}
公共类MyAdapter扩展了RecyclerView.Adapter{ 私有ArrayList数据集; 公共类ImageViewHolder扩展了RecyclerView.ViewHolder{ //图像视图模拟图像; 公共文本视图txtHeader; 公共文本视图txtFooter; 公共图像视图持有者(视图项视图){ 超级(项目视图); txtHeader=(TextView)itemView.findViewById(R.id.firstLine1); txtFooter=(TextView)itemView.findViewById(R.id.secondLine1); } } //提供对每个数据项的视图的引用 //复杂数据项可能需要每个项有多个视图,并且 //您可以访问视图持有者中数据项的所有视图 公共类TextViewHolder扩展了RecyclerView.ViewHolder{ //在本例中,每个数据项只是一个字符串 公共文本视图txtHeader; 公共文本视图txtFooter; 公共文本视图持有者(视图v){ 超级(五); txtHeader=(TextView)v.findViewById(R.id.firstLine); txtFooter=(TextView)v.findViewById(R.id.secondLine); } } 公共空添加(整型位置,字符串项){ mDataset.add(位置、项目); (位置); } 公共无效删除(字符串项){ int position=mDataset.indexOf(项目); mDataset.remove(位置); 已移除(位置)的项目; } //提供合适的构造函数(取决于数据集的类型) 公共MyAdapter(ArrayList myDataset){ mDataset=myDataset; } //创建新视图(由布局管理器调用) @凌驾 public RecyclerView.ViewHolder onCreateViewHolder(视图组父级, int视图类型){ if(viewType==图像类型){ //创建新视图 视图v=LayoutInflater.from(parent.getContext()).flate(R.layout.rowlayout,parent,false); //设置视图的大小、边距、填充和布局参数 ImageViewHolder vh=新的ImageViewHolder(v); 返回vh; }否则{ //创建新视图 视图v=LayoutInflater.from(parent.getContext()).flate(R.layout.rowlayout,parent,false); //设置视图的大小、边距、填充和布局参数 TextViewHolder vh=新的TextViewHolder(v); 返回vh; } } 私有静态最终整数类型_IMAGE=1; 私有静态最终int TYPE_GROUP=2; @凌驾 public int getItemViewType(int位置){ //这里是选择视图类型的自定义逻辑 返回位置==0?类型\图像:类型\组; } //替换视图的内容(由布局管理器调用) @凌驾 BindViewHolder上的公共无效(RecyclerView.ViewHolder文本ViewHolder,int位置){ 开关(TextViewHolder.getItemViewType()){ 案例类型\u图像: ImageViewHolder ImageViewHolder=(ImageViewHolder)TextViewHolder; //imageViewHolder.mImage.setImageResource(…); 最终字符串namev=mDataset.get(位置); imageViewHolder.txtHeader.setText(mDataset.get(position)); imageViewHolder.txtHeader.setOnClickListener(新视图.OnClickListener(){ @凌驾 公共void onClick(视图v){ 删除(namev); } }); 打破 病例类型组: TextViewHolder viewHolder=(TextViewHolder)TextViewHolder; //viewHolder.txtHeader.setText(…) 最终字符串名称=mDataset.get(位置); viewHolder.txtHeader.setText(mDataset.get(position)); viewHolder.txtHeader.setOnClickListener(新视图.OnClickListener(){ @凌驾 公共void onClick(视图v){ 删除(姓名); } }); viewHolder.txtFooter.setText(“页脚:+mDataset.get(position)); 打破 } /* //-在此位置从数据集中获取元素 //-用该元素替换视图的内容 最终字符串名称=mDataset.get(位置); holder.txtHeader.setText(mDataset.get(position)); holder.txtHeader.setOnClickListener(新的OnClickListener(){ @凌驾 公共void onClick(视图v){ 删除(姓名); } }); holder.txtFooter.setText(“页脚:+mDataset.get(position)); */ } //返回数据集的大小(由布局管理器调用) @凌驾 public int getItemCount(){ 返回mDataset.size(); } }
ImageViewHolder是否扩展或实现了ViewHolder?如果没有,该转换将不起作用。@Gabeschen是的,因为我已经在我的代码
公共类ImageViewHolder中发布了扩展的RecyclerView.ViewHolder{
您有
MyAdapter
扩展
RecyclerView.Adapter
ImageViewHolder
扩展
RecyclerView.ViewHolder
。没有。ImageViewHolder扩展了RecyclerView.ViewHolder。ViewHolder扩展了RecyclerView.ViewHolder。但是ImageViewHolder不扩展ViewHolder。通过重用名称y你把自己和编译器搞糊涂了(当我打印这篇文章的初稿时,我也把自己弄糊涂了),而仅仅是他自己…编译器确实弄糊涂了,并给出了一个错误…这行呢,我这样改了,对吗?public void onBindViewHolder(R
    @Override
    public MyAdapter.TextViewHolder onCreateViewHolder(ViewGroup parent,
                                               int viewType)
   @Override
   public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent,
                                               int viewType)
 @Override
 public void onBindViewHolder(TextViewHolder TextViewHolder, int position) 
 @Override
 public void onBindViewHolder(RecyclerView.ViewHolder holder, int position)
   @Override
   public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent,
                                               int viewType){
    switch (viewType) {

       case TYPE_IMAGE: {
            View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.XXX, parent, false);
            return new ImageViewHolder(itemView);
            }
       case TYPE_GROUP: {
            View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.XXX, parent, false);
            return new TextViewHolder(itemView);
           }
      }
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private ArrayList<String> mDataset;

    public class ImageViewHolder extends RecyclerView.ViewHolder {
        //ImageView mImage;
        public TextView txtHeader;
        public TextView txtFooter;
        public ImageViewHolder(View itemView) {
            super (itemView);
            txtHeader = (TextView) itemView.findViewById(R.id.firstLine1);
            txtFooter = (TextView) itemView.findViewById(R.id.secondLine1);
        }
    }

    // Provide a reference to the views for each data item
    // Complex data items may need more than one view per item, and
    // you provide access to all the views for a data item in a view holder
    public class TextViewHolder extends RecyclerView.ViewHolder {
        // each data item is just a string in this case
        public TextView txtHeader;
        public TextView txtFooter;

        public TextViewHolder(View v) {
            super(v);
            txtHeader = (TextView) v.findViewById(R.id.firstLine);
            txtFooter = (TextView) v.findViewById(R.id.secondLine);
        }
    }

    public void add(int position, String item) {
        mDataset.add(position, item);
        notifyItemInserted(position);
    }

    public void remove(String item) {
        int position = mDataset.indexOf(item);
        mDataset.remove(position);
        notifyItemRemoved(position);
    }

    // Provide a suitable constructor (depends on the kind of dataset)
    public MyAdapter(ArrayList<String> myDataset) {
        mDataset = myDataset;
    }

    // Create new views (invoked by the layout manager)
    @Override
    public RecyclerView.ViewHolder  onCreateViewHolder(ViewGroup parent,
                                                       int viewType) {
        if (viewType == TYPE_IMAGE) {
            // create a new view
            View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.rowlayout, parent, false);
            // set the view's size, margins, paddings and layout parameters
            ImageViewHolder vh = new ImageViewHolder(v);
            return vh;
        } else {
            // create a new view
            View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.rowlayout, parent, false);
            // set the view's size, margins, paddings and layout parameters
            TextViewHolder vh = new TextViewHolder(v);
            return vh;
        }
    }

    private static final int TYPE_IMAGE = 1;
    private static final int TYPE_GROUP = 2;

    @Override
    public int getItemViewType(int position) {
        // here your custom logic to choose the view type
        return position == 0 ? TYPE_IMAGE : TYPE_GROUP;
    }

    // Replace the contents of a view (invoked by the layout manager)
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder TextViewHolder, int position) {

        switch (TextViewHolder.getItemViewType()) {

            case TYPE_IMAGE:
                ImageViewHolder imageViewHolder = (ImageViewHolder) TextViewHolder;
                // imageViewHolder.mImage.setImageResource(...);
                final String namev = mDataset.get(position);
                imageViewHolder.txtHeader.setText(mDataset.get(position));
                imageViewHolder.txtHeader.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        remove(namev);
                    }
                });

                break;

            case TYPE_GROUP:
                TextViewHolder viewHolder = (TextViewHolder) TextViewHolder;
                //  viewHolder.txtHeader.setText(...)
                final String name = mDataset.get(position);
                viewHolder.txtHeader.setText(mDataset.get(position));
                viewHolder.txtHeader.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        remove(name);
                    }
                });

                viewHolder.txtFooter.setText("Footer: " + mDataset.get(position));

                break;
        }
/*
        // - get element from your dataset at this position
        // - replace the contents of the view with that element
        final String name = mDataset.get(position);
        holder.txtHeader.setText(mDataset.get(position));
        holder.txtHeader.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                remove(name);
            }
        });

        holder.txtFooter.setText("Footer: " + mDataset.get(position));
*/
    }

    // Return the size of your dataset (invoked by the layout manager)
    @Override
    public int getItemCount() {
        return mDataset.size();
    }

}