在onCreateViewHolder中使用不同的视图

3
我按照Google开发者YouTube频道的这个教程来实现AdMob原生广告。
我遇到了以下错误:
required: packagename.adapter.viewHolder
found   : packagename.adapter.NativeExpressAdViewHolder

这是我的 onCreateViewHolder 方法的样子:

public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    switch (viewType) {
        case AD_VIEW_TYPE:
            View nativeExpressLayoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.native_express_add_container, parent, false);
            return new NativeExpressAdViewHolder(nativeExpressLayoutView); 
        case MENU_ITEM_VIEW_TYPE:
            default:
            View myLayoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list, parent, false);
            return new ViewHolder(myLayoutView);
    }
}

这里有两个不同的ViewHolder类:

class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {      

    ViewHolder(View itemView) {
        super(itemView);
    }          
}

public class NativeExpressAdViewHolder extends RecyclerView.ViewHolder {
    NativeExpressAdViewHolder(View view) {
        super(view);
    }
}

以下是没有答案的类似问题:


编辑:

这是我完整的适配器,如请求所示:

public class MainActivityVideoAdapter extends Adapter<MainActivityVideoAdapter.ViewHolder> {
ArrayList<Bitmap> bitmapArrayList;
Context context;
LayoutInflater layoutInflater;
View myLayoutView;
ArrayList<PathModel> ThumbPathList;
ArrayList<PathModel> VideoPathList = new ArrayList();
static DBManager manager;
long _id;

private static final int MENU_ITEM_VIEW_TYPE = 0;
private static final int AD_VIEW_TYPE = 1;

class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    //Video Title
    TextView videoName;
    //Video Image
    CircularImageView videoThumb;
    //PopupMenu
    ImageButton viewholderOtions;

    ViewHolder(View itemView) {
        super(itemView);
        viewholderOtions = (ImageButton) myLayoutView.findViewById(R.id.viewholderOptions);
        videoName = (TextView) myLayoutView.findViewById(R.id.FilePath);
        videoThumb = (CircularImageView) myLayoutView.findViewById(R.id.VideoThumbnail);
        //View onClick
        itemView.setOnClickListener(this);
        //Popup onClick
        viewholderOtions.setOnClickListener(this);
    }


    //Handling click events
    @Override
    public void onClick(View v) {
        if (v == viewholderOtions) {

            int position = (int) v.getTag();

            showPopupMenu(viewholderOtions, position);
        }

    }
}

public class NativeExpressAdViewHolder extends RecyclerView.ViewHolder {
    NativeExpressAdViewHolder(View view) {
        super(view);
    }
}

public MainActivityVideoAdapter(Context context, ArrayList<PathModel> ThumbPathList, ArrayList<PathModel> VideoPathList) {
    this.context = context;
    this.ThumbPathList = ThumbPathList;
    this.VideoPathList = VideoPathList;
}

public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    switch (viewType) {
        case AD_VIEW_TYPE:
            View nativeExpressLayoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.native_express_add_container, parent, false);
            return new NativeExpressAdViewHolder(nativeExpressLayoutView);
        case MENU_ITEM_VIEW_TYPE:
        default:
            View myLayoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list, parent, false);
            return new ViewHolder(myLayoutView);
    }
}

public void onBindViewHolder(final ViewHolder myHolder, final int position) {
    int viewType = getItemViewType(position);
    switch (viewType) {
        case AD_VIEW_TYPE:

        case MENU_ITEM_VIEW_TYPE:
        default:

            final PathModel videoPathModel = this.VideoPathList.get(position);
            PathModel thumbathModel = this.ThumbPathList.get(position);
            File file = new File(videoPathModel.getPath());
            String filename = file.getName();
            myHolder.videoName.setText(filename);
            myHolder.videoThumb.setImageURI(Uri.parse(thumbathModel.getPath()));
            myHolder.viewholderOtions.setTag(position);

            myHolder.itemView.setOnClickListener(new View.OnClickListener() {


                @Override
                public void onClick(View v) {                
                Intent intent= new Intent(context, VideoPlayerActivity.class);              
                intent.putExtra("fromFA2", "fromFA2");
                context.startActivity(intent);



                }


            });

    }


}

类似的“问题”??首先这里根本就没有问题! - Mehmet K
使用此 Viewholder:@Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { } - KuLdip PaTel
请发布完整的适配器,这将有助于确定您使用了哪些类。 - Amrish Kakadiya
@AmrishKakadiya 我已经添加了完整的适配器。 - ClassA
3个回答

1

我认为将类名叫做ViewHolder并不是一个好的选择。可以将其命名为MenuViewHolder或者其他名称,因为现在当你在方法中简单地写ViewHolder时:

public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

它假设你正在考虑你自己的类ViewHolder,而不是RecyclerView.ViewHolder,因此类型不兼容。你可以通过将类名更改为其他名称或者更改方法声明来修复它:
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

尽管后者也可以解决这个问题,但我会选择更改名称,因为将类的名称与本机名称相同(例如View、ViewHolder、BaseAdapter等)不是一个好的做法,因为它可能会产生混淆,就像在这里一样。

将其更改为RecyclerView.ViewHolder并没有起作用,您能否详细说明一下第二点关于更改名称的内容? - ClassA
是的。"这里有我的两个不同的ViewHolder类:"。你需要将第一个类的名称更改为更好的名称,比如MenuViewHolder。并且不要忘记在case MENU_ITEM_VIEW_TYPE:中也要填充它。 - Vucko
抱歉,我尝试了但不确定我是否正确理解您的意思。我已经添加了我的完整适配器,请您编辑您的答案并指示给我,再次对我没有理解道歉。 - ClassA
@ClassA 兄弟,我基本上写了和“被接受”的答案一样的东西,但是你一个小时后接受了他的答案,而他的解决方案是你说不起作用的那个... - Vucko
再次对此表示抱歉,非常感谢您抽出时间来帮助我。 - ClassA
显示剩余2条评论

1
使用 RecyclerView 的 ViewHolder,而不是自己的 ViewHolder。
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    switch (viewType) {
        case AD_VIEW_TYPE:
            View nativeExpressLayoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.native_express_add_container, parent, false);
            return new NativeExpressAdViewHolder(nativeExpressLayoutView); 
        case MENU_ITEM_VIEW_TYPE:
            default:
            View myLayoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list, parent, false);
            return new ViewHolder(myLayoutView);
    }
}

更改为 RecyclerView.ViewHolder 并没有起作用。 - ClassA

1

你好 @ClassA,我发现你在 onBindViewHolder() 中导入了本地类,而不是 RecyclerView.ViewHolder

请查看以下代码,这可能会对你有所帮助。

public class MainActivityVideoAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

/*
------------------
your constructor goes here
-----------------
*/

 @Override
    public int getItemCount() {
        return 0;
    }

    public void onBindViewHolder(final RecyclerView.ViewHolder myHolder, final int position) {
        int viewType = getItemViewType(position);
        switch (viewType) {
            case AD_VIEW_TYPE:
            break;

            case MENU_ITEM_VIEW_TYPE:
            break;
        }
    }

   public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        switch (viewType) {
            case AD_VIEW_TYPE:
                View nativeExpressLayoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.native_express_add_container, parent, false);
                return new NativeExpressAdViewHolder(nativeExpressLayoutView);
            case MENU_ITEM_VIEW_TYPE:
                View myLayoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list, parent, false);
                return new ViewHolder(myLayoutView);
        }
    }

   class ViewHolder extends RecyclerView.ViewHolder  {

        ViewHolder(View itemView) {
            super(itemView);
        }
    }

    public class NativeExpressAdViewHolder extends RecyclerView.ViewHolder {
        NativeExpressAdViewHolder(View view) {
            super(view);
        }
    }
}

这段代码不包含你的变量和逻辑,它只是用于完美导入和使用方法。

如果这解决了你的问题,请批准此答案。 编程愉快。


1
基本上你抄袭了我和另一个人在你之前一个小时说的话。不错,真不错。 - Vucko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接