Android 不兼容类型:无法将viewholder强制转换为imageviewholder
我正在遵循一个RecyclerView示例,我有这个错误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
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();
}
}