【问题标题】:Incompatible types error in ArrayList<Object>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;
    }
}

我在 StackOverFlow 上尝试了一些类似这个 (Question) 的问题,但我无法理解解决方案的基本概念,我已经将数据类型更改为 Object(来自 CardSetterGetter)。

还告诉我,如果这个转换问题得到解决并且 arrayList 返回 adView 预期 CardSetterGetter 或反之亦然,我是否需要将所有此类语句放在 try catch 块中?

【问题讨论】:

  • 你能发布你的CardSetterGetter
  • @Pavneet_Singh 当然,我做了一些修改。
  • 所以如果你传递一个ArrayList&lt;CardSetterGetter&gt; 列表,那么它怎么会有NativeExpressAdView 对象呢?我们需要知道NativeExpressAdView 来自哪里
  • @Pavneet_Singh 我正在按照谷歌教程的官方教程在 RecyclerView 中投放 NativeExpressAdView 广告。 (youtube.com/watch?v=LZCZSeFTvyk)

标签: java android arraylist casting android-recyclerview


【解决方案1】:

问题:您的 List 包含两种项目 CardSetterGetterNativeExpressAdView 因此您需要使用 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 提示:为了安全铸造,您可以使用 instanceofif listitem instanceod AdView 然后将 case to adview else 投射到您的 CardSetterGetter 类型
【解决方案2】:

问题出在您的成员定义中:

private ArrayList<Object> arrayList = new ArrayList<>();

应该是这样的:

private ArrayList<CardSetterGetter> arrayList = new ArrayList<>();

这里的问题是ArrayList&lt;CardSetterGetter&gt; 不能分配给ArrayList&lt;Object&gt; - 尽管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&lt;Object&gt; arrayList

private ArrayList&lt;Object&gt; arrayList = new ArrayList&lt;&gt;();

private ArrayList&lt;CardSetterGetter&gt; arrayList = new ArrayList&lt;&gt;();

这会解决你的问题

【讨论】:

  • 这会删除当前的错误,但会在onBindViewHolder() 的第 10 行创建一个类似的(转换)错误,我们正试图从这个 arrayList 中获取 adView。
  • 让我看看为什么会这样
猜你喜欢
  • 2012-10-19
  • 2013-10-29
  • 1970-01-01
  • 1970-01-01
  • 2014-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-30
相关资源
最近更新 更多