首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有没有为RecyclerView ViewHolders处理数据绑定的类?

有没有为RecyclerView ViewHolders处理数据绑定的类?
EN

Stack Overflow用户
提问于 2019-07-31 04:18:39
回答 1查看 44关注 0票数 0

我一直在寻找一种方便的方法来外包RecyclerView.Adapter中的一些数据绑定代码。我正在看下面的教程:https://www.journaldev.com/12372/android-recyclerview-example,它在2-3个不同的ViewHolders上似乎工作得很好。但是,一旦不同ViewHolders的数量增加(比方说10个或更多),onBindViewHolder方法的大小就会爆炸式增长。因此,我正在寻找一种从适配器中外包此数据绑定部分的方法。因为我不想重复发明轮子,所以我在寻找一个可能已经存在的解决方案。

EN

回答 1

Stack Overflow用户

发布于 2019-07-31 04:18:39

如果这个问题没有现有的解决方案,我想出了以下想法:

首先创建ViewHolder的子类并添加另一个抽象方法bindData

代码语言:javascript
运行
复制
abstract class DataBindingViewHolder<T> extends RecyclerView.ViewHolder {

         DataBindingViewHolder(@NonNull View itemView) {
             super(itemView);
         }

         abstract void bindData(T t);
    }

其次,根据需要创建任意多个此类的子类。例如这两个:

代码语言:javascript
运行
复制
class ItemViewHolder extends DataBindingViewHolder<Item> {

    TextView itemNameTextView;
    TextView itemDescriptionTextView;


    ItemViewHolder(@NonNull View itemView) {
        super(itemView);
        // TODO init fields here
    }

    @Override
    void bindData(Item item) {
        String itemName = item.getName();
        String itemDescription = item.getDescription();

        itemNameTextView.setText(itemName);
        itemDescriptionTextView.setText(itemDescription);
    }
}
代码语言:javascript
运行
复制
class ExtendedItemViewHolder extends DataBindingViewHolder<Item> {

    TextView itemNameTextView;
    TextView itemDescriptionTextView;
    TextView itemPriceTextView;
    ImageView itemPreviewImageView;


    ExtendedItemViewHolder(@NonNull View itemView) {
        super(itemView);
        // TODO init fields here
    }

    @Override
    void bindData(Item item) {
        String itemName = item.getName();
        String itemDescription = item.getDescription();
        String itemPrice = item.getPrice();
        Bitmap itemPreviewImage = item.getImage();

        itemNameTextView.setText(itemName);
        itemDescriptionTextView.setText(itemDescription);
        itemPriceTextView.setText(itemPrice);
        itemPreviewImageView.setImageBitmap(itemPreviewImage);
    }
}

最后,onBindViewHolder方法现在看起来就像这样:

代码语言:javascript
运行
复制
    @Override
    public void onBindViewHolder(@NonNull DataBindingViewHolder<Item> viewHolder, int i) {
        Item item = itemList.get(i);
        viewHolder.bindData(item);
    }

请记住:您仍然需要覆盖getItemViewType方法,这取决于您需要提供的数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57279437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档