Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ArrayList中存在不兼容类型错误<;对象>;_Java_Android_Arraylist_Casting_Android Recyclerview - Fatal编程技术网

Java ArrayList中存在不兼容类型错误<;对象>;

Java ArrayList中存在不兼容类型错误<;对象>;,java,android,arraylist,casting,android-recyclerview,Java,Android,Arraylist,Casting,Android Recyclerview,我试图将广告放在一个RecyclerView中,该视图当前正在解析一个JSON文件,问题是当我试图用广告或JSON中的数据填充它时,ArrayList抛出了一个强制转换错误 错误发生在两个位置,一个在RecycleServiceAdapter()方法体中,另一个在BindViewHolder()中 这是我在RecycleServiceAdapter.java中的代码(错误在第5行注释) 这是我的CardSetterGetter.java public class CardSetterGetter

我试图将广告放在一个RecyclerView中,该视图当前正在解析一个JSON文件,问题是当我试图用广告或JSON中的数据填充它时,ArrayList抛出了一个强制转换错误

错误发生在两个位置,一个在
RecycleServiceAdapter()
方法体中,另一个在
BindViewHolder()

这是我在RecycleServiceAdapter.java中的代码(错误在第5行注释)

这是我的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的问题,比如这个(),但我无法理解解决方案的基本概念,我已经将数据类型更改为Object(从CardSetTargeter)


另外,请告诉我,如果此强制转换问题得到解决,并且arrayList返回adView where CardSetterGetter,或者反之亦然,那么会发生什么情况,我是否需要将所有此类语句放入try catch块中?

像这样更改arrayList初始化

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

问题在于您的成员定义:

private ArrayList<Object> arrayList = new ArrayList<>();
private ArrayList ArrayList=new ArrayList();
可能应该是:

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

这里的问题是,
ArrayList
不可分配给
ArrayList
——尽管
CardSetterGetter
(以及所有对象)可分配给
Object

在RecycleServiceAdapter.java中更改
ArrayList ArrayList

private ArrayList ArrayList=new ArrayList()

private ArrayList ArrayList=new ArrayList()


这将解决您的问题

问题:您的列表包含两种项目
CardSetterGetter
NativeExpressAdView
,因此您需要使用
对象列表
而不是任何特定类型,因为这两种类型没有关系,并在适当的位置应用强制转换

用这个

public RecyclerViewAdapter(Context context, ArrayList<Object> arrayList, ArrayList<String> favouriteItemList, int totalCount) {
而不是

public RecyclerViewAdapter(Context context, ArrayList<CardSetterGetter> arrayList, ArrayList<String> favouriteItemList, int totalCount) {


列表中
position%8==0
项(0,8,16,24,32…)的平均结果将是
NATIVE\u EXPRESS\u AD\u VIEW\u类型
类型,因此它是
position
相关数学

这会删除当前的错误,但会在
onBindViewHolder()
的第10行中创建一个类似的(强制转换)错误,我们正在尝试从该arrayList获取建议。在那里,您还必须将模型类型更改为CardSetTargetTer。您能告诉我怎么做吗?如果我知道您在这里想要实现什么,我可以告诉您,此处的arraylist不能强制转换为NativeExpressAdView,因为它是CardSetterGetter类型,如果您只想按位置获取arraylist,只需像此CardSetterGetter CardSetterGetter一样;CardsetterGet=arrayList.get(位置);这会删除当前错误,但会在
onBindViewHolder()
的第10行中创建一个类似的(强制转换)错误,我们正试图从该arrayList获取建议。让我检查一下为什么会发生这种情况。这会删除当前错误,但会在
onBindViewHolder()的第10行中创建一个类似的(强制转换)错误,我们试图从该阵列列表中获取建议的位置。您可以发布您的
CardSetterGetter
class@Pavneet_Singh当然,我做了一些编辑。因此,如果您传递的是
ArrayList
列表,那么它如何拥有
NativeExpressAdView
对象?,我们需要知道NativeExpressAdView从哪里来from@Pavneet_Singh我是按照谷歌的官方教程在RecyclerView中发布ad NativeExpressAdView的。()这解决了问题,但是现在我在使用这个适配器的片段中得到了转换错误。应为对象,但CardSetTargeter为found@Ishanhrx您知道,根据此逻辑,您只能将adtype对象添加到位置的列表中,其中位置%8==0,因此,如果您违反此规则,您将得到异常,因此我在if-else块中调用此方法?@Ishanhrx请看您下面的代码是这样的列表
add,item,item,item,item,item,item,add,item,item…
注意位置%8==0始终是ads items,因此您的项目也应该遵循此操作,如果你在定位上没有做任何改变,那么把你的错误详细信息和相关代码发布在end@Ishanhrx提示:为了安全强制转换,您可以使用
instanceof
一样,如果listitem instanceod AdView
那么case to AdView
else
强制转换为您的CardSetTargeter类型
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) {
   // ITEMS_PER_AD = 8
   return (position % MainActivity.ITEMS_PER_AD == 0) ? NATIVE_EXPRESS_AD_VIEW_TYPE
                : MENU_ITEM_VIEW_TYPE;