RecyclerView的onBindViewHolder中的ClassCastException

投票

我想在回收者视图中显示不同的项目/布局。所以这就是我定义这些项目的方式:

public class SearchItem {

    public static final int TYPE_DEFAULT = 0;
    public static final int TYPE_LOADING = 1;

    public int type;

    public SearchItem(int type) {
        this.type = type;
    }

    public static class DefaultItem extends SearchItem {

        public String title;

        public DefaultItem(String title) {
            super(TYPE_DEFAULT);
            this.title = title;
        }
    }

    public static class LoadingItem extends SearchItem {

        public String icon, title;

        public LoadingItem(String icon, String title) {
            super(TYPE_LOADING);
            this.icon = icon;
            this.title = title;
        }
    }
}

所以基本上我有两种类型。在适配器中,将为每个项目选择适当的布局:

public class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.BaseViewHolder>{

    public ArrayList<SearchItem> items = new ArrayList<>();

    @Override
    public int getItemCount() {
        return items.size();
    }

    @Override
    public int getItemViewType(int position) {
        return items.get(position).type;
    }


    @Override
    public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        LayoutInflater mInflater = LayoutInflater.from(parent.getContext());

        switch (viewType) {
            case SearchItem.TYPE_LOADING:
                ViewGroup vLoading = (ViewGroup) mInflater.inflate(R.layout.search_item_loading, parent, false);
                return new LoadingViewHolder(vLoading);
            case SearchItem.TYPE_DEFAULT:default:
                ViewGroup vDefault = (ViewGroup) mInflater.inflate(R.layout.search_item_default, parent, false);
                return new DefaultViewHolder(vDefault);
        }
    }

    @Override
    public void onBindViewHolder(BaseViewHolder holder, int position) {

        SearchItem item = items.get(position);

        switch (holder.getItemViewType()) {
            case SearchItem.TYPE_DEFAULT:
                DefaultViewHolder defaultViewHolder = (DefaultViewHolder) holder;
                defaultViewHolder.mTextViewTitle.setText(((SearchItem.DefaultItem)item).title);
            case SearchItem.TYPE_LOADING:
                LoadingViewHolder loadingViewHolder = (LoadingViewHolder) holder;
                loadingViewHolder.mTextViewIcon.setText(((SearchItem.LoadingItem)item).icon);
                loadingViewHolder.mTextViewTitle.setText(((SearchItem.LoadingItem)item).title);
        }
    }

    /**
     * Base view holder.
     */
    public static class BaseViewHolder extends RecyclerView.ViewHolder {
        public BaseViewHolder(View view) {
            super(view);
        }
    }

    public static class DefaultViewHolder extends BaseViewHolder {

        @Bind(R.id.mTextViewTitle)
        TextView mTextViewTitle;

        public DefaultViewHolder(View mView) {
            super(mView);
            ButterKnife.bind(this, mView);
        }
    }

    public static class LoadingViewHolder extends BaseViewHolder {

        @Bind(R.id.mTextViewIcon)
        TextView mTextViewIcon;

        @Bind(R.id.mTextViewTitle)
        TextView mTextViewTitle;

        public LoadingViewHolder(View mView) {
            super(mView);
            ButterKnife.bind(this, mView);
        }
    }
}

onBindViewHolder

LoadingViewHolder loadingViewHolder = (LoadingViewHolder) holder;

机器人工作室已经给我的警告,铸造时,我可能会得到一个异常holderLoadingViewHolder运行项目时,我得到:

SearchAdapter$DefaultViewHolder cannot be cast to SearchAdapter$LoadingViewHolder

因此,以某种方式将DefaultViewHolder强制转换为LoadingViewHolder,但不应这样做。相反,应该强制转换BaseViewHolder。你看到错了吗?

UMESH0492

根据您的要求和要达到的目的,您编写的代码是错误的。如我所见,您正在扩展的实现不是通用RecyclerView Holder,即它将基础视图持有人作为单个持有人

extends RecyclerView.Adapter<RecyclerView.ViewHolder>

而不是

extends RecyclerView.Adapter<SearchAdapter.BaseViewHolder>

这里的整个代码该怎么做


https://gist.github.com/umesh0492/e65d5195d8962b1a3049

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

视图在RecyclerView Adapter的onBindViewHolder中返回NullPointerException

来自分类Dev

如何在“ onBindViewHolder”中获取recyclerview项目的高度

来自分类Dev

在OnBindViewholder recyclerview android中单击侦听器

来自分类Dev

如何在其适配器的onBindViewHolder中更新recyclerView?

来自分类Dev

如何在RecyclerView适配器的onBindViewHolder中声明overridePendingTransition?

来自分类Dev

在Recyclerview中错误地运行onBindViewHolder-Kotlin

来自分类Dev

为什么我的recyclerView重做onBindViewHolder中的内容?

来自分类Dev

在OnBindViewholder recyclerview android中单击侦听器

来自分类Dev

如何在其适配器的onBindViewHolder中更新recyclerView?

来自分类Dev

如何在RecyclerView适配器的onBindViewHolder中声明overridePendingTransition?

来自分类Dev

在 RecyclerView 的 OnBindViewHolder 中更改视图的文本颜色或背景颜色

来自分类Dev

RecyclerView子项单击onBindViewHolder()

来自分类Dev

RecyclerView onBindViewHolder onclicklistener行为

来自分类Dev

RecyclerView何时使用ItemDecoration与onBindViewHolder

来自分类Dev

在onBindViewHolder RecyclerView内部添加滑动

来自分类Dev

RecyclerView何时使用ItemDecoration与onBindViewHolder

来自分类Dev

RecyclerView onBindviewholder Dialog clicklistner 动画

来自分类Dev

onBindViewHolder 和 RecyclerView 如何工作?

来自分类Dev

Recyclerview ViewHolder:onCreateViewHolder,视图绑定和onBindViewHolder在同一类中

来自分类Dev

onBindViewHolder 仅针对我在 recyclerview 中单击的第一个元素调用

来自分类Dev

在 onBindViewHolder 中调用 notifyDataSetChanged

来自分类Dev

RecycleView 中的 onBindViewHolder 问题

来自分类Dev

RecyclerView onBindViewHolder位置不符合预期

来自分类Dev

RecyclerView.Adapter onBindViewHolder()位置错误

来自分类Dev

RecyclerView onBindViewHolder 没有绘制我的视图

来自分类Dev

onBindViewHolder 中的 if-else 效率

来自分类Dev

RecyclerView onBindViewHolder仅在getItemViewType更改时调用

来自分类Dev

为什么RecyclerView onBindViewHolder仅调用一次?

来自分类Dev

RecyclerView-当未调用onBindViewHolder时,findViewHolderForPosition始终返回null

Related 相关文章

  1. 1

    视图在RecyclerView Adapter的onBindViewHolder中返回NullPointerException

  2. 2

    如何在“ onBindViewHolder”中获取recyclerview项目的高度

  3. 3

    在OnBindViewholder recyclerview android中单击侦听器

  4. 4

    如何在其适配器的onBindViewHolder中更新recyclerView?

  5. 5

    如何在RecyclerView适配器的onBindViewHolder中声明overridePendingTransition?

  6. 6

    在Recyclerview中错误地运行onBindViewHolder-Kotlin

  7. 7

    为什么我的recyclerView重做onBindViewHolder中的内容?

  8. 8

    在OnBindViewholder recyclerview android中单击侦听器

  9. 9

    如何在其适配器的onBindViewHolder中更新recyclerView?

  10. 10

    如何在RecyclerView适配器的onBindViewHolder中声明overridePendingTransition?

  11. 11

    在 RecyclerView 的 OnBindViewHolder 中更改视图的文本颜色或背景颜色

  12. 12

    RecyclerView子项单击onBindViewHolder()

  13. 13

    RecyclerView onBindViewHolder onclicklistener行为

  14. 14

    RecyclerView何时使用ItemDecoration与onBindViewHolder

  15. 15

    在onBindViewHolder RecyclerView内部添加滑动

  16. 16

    RecyclerView何时使用ItemDecoration与onBindViewHolder

  17. 17

    RecyclerView onBindviewholder Dialog clicklistner 动画

  18. 18

    onBindViewHolder 和 RecyclerView 如何工作?

  19. 19

    Recyclerview ViewHolder:onCreateViewHolder,视图绑定和onBindViewHolder在同一类中

  20. 20

    onBindViewHolder 仅针对我在 recyclerview 中单击的第一个元素调用

  21. 21

    在 onBindViewHolder 中调用 notifyDataSetChanged

  22. 22

    RecycleView 中的 onBindViewHolder 问题

  23. 23

    RecyclerView onBindViewHolder位置不符合预期

  24. 24

    RecyclerView.Adapter onBindViewHolder()位置错误

  25. 25

    RecyclerView onBindViewHolder 没有绘制我的视图

  26. 26

    onBindViewHolder 中的 if-else 效率

  27. 27

    RecyclerView onBindViewHolder仅在getItemViewType更改时调用

  28. 28

    为什么RecyclerView onBindViewHolder仅调用一次?

  29. 29

    RecyclerView-当未调用onBindViewHolder时,findViewHolderForPosition始终返回null

热门标签

归档