ArrayList<Object> 中的类型不兼容错误
Posted
技术标签:
【中文标题】ArrayList<Object> 中的类型不兼容错误【英文标题】:Incompatible types error in ArrayList<Object> 【发布时间】:2018-03-11 10:23:10 【问题描述】:我正在尝试将广告放在当前正在解析 JSON 文件的 RecyclerView 中,问题是当我尝试用广告或 JSON 中的数据填充 ArrayList 时,它会引发转换错误。
错误发生在两个地方,一个在RecyclerViewAdapter()
方法体中,另一个在BindViewHolder()
。
这是我来自 RecyclerViewAdapter.java 的代码(错误在第 5 行注释)
private ArrayList<Object> arrayList = new ArrayList<>();
public RecyclerViewAdapter(Context context, ArrayList<CardSetterGetter> arrayList, ArrayList<String> favouriteItemList, int totalCount)
this.context = context;
this.arrayList = arrayList; //Incompatible types. Required: ArrayList<java.lang.object>; found: ArrayList<com.comp.app.modal.CardSetterGetter>
this.favouriteItemList = favouriteItemList;
this.totalCount = totalCount;
onBindViewHolder()
(第 27 行注释错误)
@Override
public void onBindViewHolder(final RecyclerViewHolder holder, final int position)
int viewType = getItemViewType(position);
switch (viewType)
case AD_VIEW_TYPE:
NativeExpressAdViewHolder nativeExpressHolder = (NativeExpressAdViewHolder)holder;
NativeExpressAdView adView = (NativeExpressAdView)arrayList.get(position);
ViewGroup adCardView = (ViewGroup)nativeExpressHolder.itemView;
adCardView.removeAllViews();
if(adView.getParent() != null)
((ViewGroup)adView.getParent()).removeView(adView);
adCardView.addView(adView);
break;
case MENU_ITEM_VIEW_TYPE:
default:
String card_image;
CardSetterGetter cardSetterGetter;
cardSetterGetter = arrayList.get(position); //Incompatible types. Required: ArrayList<com.comp.app.modal.CardSetterGetter>; found: ArrayList<java.lang.object>;
card_image = constants.SERVERIP.concat(cardSetterGetter.getImageurl());
holder.cardSetterGetter = cardSetterGetter;
holder.title.setText(cardSetterGetter.getImagetitle()); //set title
PointF focusPoint = new PointF(0.5f, 0f);
// your app populates the focus point
holder.image // set image
.getHierarchy()
.setActualImageFocusPoint(focusPoint);
holder.image.setImageURI(Uri.parse(card_image));
这是我的 CardSetterGetter.java
public class CardSetterGetter implements Serializable
private String imagetitle ;
private String imageurl;
private String description;
private String tag;
private boolean isFavorite;
public String getImageId()
return imageId;
public void setImageId(String imageId)
this.imageId = imageId;
public String getFavourite()
return favourite;
public void setFavourite(String favourite)
this.favourite = favourite;
private String imageId ;
private String favourite ;
public String getCategory()
return category;
public void setCategory(String category)
this.category = category;
public String category;
public CardSetterGetter()
public String getImagetitle()
return imagetitle;
public void setImagetitle(String imagetitle)
this.imagetitle = imagetitle;
public String getImageurl()
return imageurl;
public void setImageurl(String imageurl)
this.imageurl = imageurl;
public String getDescription()
return description;
public void setDescription(String description)
this.description = description;
public String getTag()
return tag;
public void setTag(String tag)
this.tag = tag;
public CardSetterGetter(String imageurl , String imagetitle , String description , String category , String tag,String imageId ,String favourite)
this.imageurl = imageurl ;
this.imagetitle = imagetitle ;
this.description = description ;
this.tag = tag ;
this.category = category ;
this.isFavorite =false ;
this.imageId = imageId ;
this.favourite = favourite ;
public boolean isFavorite()
return isFavorite;
public void setFavorite(String favorite)
favourite = favorite;
我在 *** 上尝试了一些类似这个 (Question) 的问题,但我无法理解解决方案的基本概念,我已经将数据类型更改为 Object(来自 CardSetterGetter)。
还告诉我,如果这个转换问题得到解决并且 arrayList 返回 adView 预期 CardSetterGetter 或反之亦然,我是否需要将所有此类语句放在 try catch 块中?
【问题讨论】:
你能发布你的CardSetterGetter
类
@Pavneet_Singh 当然,我做了一些修改。
所以如果你传递一个ArrayList<CardSetterGetter>
列表,那么它怎么会有NativeExpressAdView
对象呢?我们需要知道NativeExpressAdView
来自哪里
@Pavneet_Singh 我正在按照谷歌教程的官方教程在 RecyclerView 中投放 NativeExpressAdView 广告。 (youtube.com/watch?v=LZCZSeFTvyk)
【参考方案1】:
问题:您的 List 包含两种项目 CardSetterGetter
和 NativeExpressAdView
因此您需要使用 Objects
的 List 而不是任何特定类型,因为这两种类型没有关系并在适当的位置应用强制转换
使用这个
public RecyclerViewAdapter(Context context, ArrayList<Object> arrayList, ArrayList<String> favouriteItemList, int totalCount)
并使用强制转换
cardSetterGetter =(CardSetterGetter ) arrayList.get(position);
而不是
public RecyclerViewAdapter(Context context, ArrayList<CardSetterGetter> arrayList, ArrayList<String> favouriteItemList, int totalCount)
还告诉我,如果这个铸造问题得到解决并且 arrayList 返回预期 CardSetterGetter 的 adView 或 反之亦然,我是否需要将所有此类语句放在 try catch 块中?
getItemViewType(position)
正在按照position
工作
// ITEMS_PER_AD = 8
return (position % MainActivity.ITEMS_PER_AD == 0) ? NATIVE_EXPRESS_AD_VIEW_TYPE
: MENU_ITEM_VIEW_TYPE;
列表中 position % 8 == 0
项目 (0,8,16,24,32...) 的平均结果将是 NATIVE_EXPRESS_AD_VIEW_TYPE
类型,因此它是 position
依赖数学。
【讨论】:
这解决了问题,但现在我在使用此适配器的片段中遇到了转换错误。需要一个对象,但找到了 CardSetterGetter @Ishanhrx 你知道按照这个逻辑,你只能将 adtype 对象添加到你的 list 到 position ,其中 position % 8 ==0 所以如果你违反这个规则,你会得到例外 所以我在 if else 块中调用这个方法? @Ishanhrx 看到你所遵循的代码有这样的列表add,item,item,item,item,item,item,add,item,item...
notice position%8==0 总是广告项目,所以你的项目也应该遵循这个,如果你没有更改定位中的任何内容,然后在最后的帖子中发布您的错误详细信息和相关代码
@Ishanhrx 提示:为了安全铸造,您可以使用 instanceof
像 if listitem instanceod AdView
然后将 case to adview else
投射到您的 CardSetterGetter 类型【参考方案2】:
问题出在您的成员定义中:
private ArrayList<Object> arrayList = new ArrayList<>();
应该是这样的:
private ArrayList<CardSetterGetter> arrayList = new ArrayList<>();
这里的问题是ArrayList<CardSetterGetter>
不能分配给ArrayList<Object>
- 尽管CardSetterGetter
(和所有对象)都可以分配给Object
。
【讨论】:
这会删除当前的错误,但会在onBindViewHolder()
的第 10 行创建一个类似的(转换)错误,我们试图从这个 arrayList 中获取 adView。【参考方案3】:
像这样改变arraylist初始化
private ArrayList<CardSetterGetter> arrayList = new ArrayList<>();
【讨论】:
这会删除当前的错误,但会在onBindViewHolder()
的第 10 行创建一个类似的(强制转换)错误,我们试图从这个 arrayList 中获取 adView。
您还必须将模型类型更改为 CardSetterGetter
你能告诉我怎么做吗?
我可以告诉你,如果我知道你想在这里实现什么,你的数组列表不能转换为 NativeExpressAdView,因为它是 CardSetterGetter 类型
如果你只是想按位置获取你的数组列表,就像这样 CardSetterGetter cardSetterGetter; cardSetterGetter = arrayList.get(position);【参考方案4】:
在 RecyclerViewAdapter.java 中更改 ArrayList<Object> arrayList
private ArrayList<Object> arrayList = new ArrayList<>();
到
private ArrayList<CardSetterGetter> arrayList = new ArrayList<>();
这会解决你的问题
【讨论】:
这会删除当前的错误,但会在onBindViewHolder()
的第 10 行创建一个类似的(转换)错误,我们正试图从这个 arrayList 中获取 adView。
让我看看为什么会这样以上是关于ArrayList<Object> 中的类型不兼容错误的主要内容,如果未能解决你的问题,请参考以下文章
在 Android 上跨会话从文件中写入然后读取 ArrayList<Object>?
Arrays$ArrayList 的 Object 对象转换为 List<Object> 对象的技巧
java中 ,ArrayList<HashMap<String,Object>> 和 HashMap<String, Object>() 有啥区别?