Android 在 RecyclerView 上使用多个不同的行来实现数据绑定(bind)功能

标签 android data-binding android-databinding

基本上我可以在 recyclerview adaper 上使用多行,没有任何问题,例如以下代码:

@Override
public ShowBookItemsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    int layout = -1;
    switch (viewType) {
        case 1:
            layout = R.layout.item_heading_one;
            break;
        case 2:
            layout = R.layout.item_heading_two;
            break;
    }

    View v = LayoutInflater.from(parent.getContext()).inflate(layout, parent, false);
    ShowBookItemsViewHolder holder = new ShowBookItemsViewHolder(v);
    return holder;
}

现在我在使用 DataBinding 时尝试使用此功能,但出现错误,但无法执行此操作

这是我的错误代码:

@Override
public RobotViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    int layout = -1;
    if (inflater == null) {
        switch (viewType) {
            case 0:
                layout = R.layout.robot_item_action;
                break;
            case 1:
                layout = R.layout.robot_user_action;
                break;
        }
        inflater = LayoutInflater.from(parent.getContext());
    }
    RobotDataBinding dataBinding = RobotDataBinding.inflate(layout, parent, false);
    return new RobotViewHolder(dataBinding);
}

最佳答案

您正尝试在实例化适配器的 View 持有者之前绑定(bind)其 View 。 View 绑定(bind)应该在 onBindViewHolder() 中执行.

创建一个扩展 RecyclerView.ViewHolder 的基本 View 持有者类并有一个抽象的 bind(Object obj) 方法 ShowBookItemsViewHolderRobotViewHolder实现。这种方法归功于 George Mount。

public abstract class BaseViewHolder extends RecyclerView.ViewHolder {

    ...

    // delegate binding to child class
    protected abstract void bind(Object obj);
}

然后在 onBindViewHolder() :

public void onBindViewHolder(BaseViewHolder holder, int position) {
    holder.bind(adapterData.get(position)
}

这会将您的adapterData对象传递给 subview 持有者进行绑定(bind):

public class ShowBookItemsViewHolder extends BaseViewHolder {

    ...

    public void bind(Object obj) {
        // Bind here...
    }
}

覆盖getItemViewType()供应onCreateViewHolder()具有不同的 View 类型。例如:

public int getItemViewType(int position) {
    // Change layout every other position
    return position % 2 == 0 ? 0 : 1;
}

使用 View 类型来构造 View 持有者:

public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    if (viewType == 0) {
        return new ShowBookItemsViewHolder(LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.your_layout, parent, false) 
    else {
        return new RobotViewHolder(LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.your_layout, parent, false) 
    }
}

确保onCreateViewHolder()返回基本 View 持有者和适配器类扩展 RecyclerView.Adapter<YourAdapter.YourBaseViewHolder> .

关于Android 在 RecyclerView 上使用多个不同的行来实现数据绑定(bind)功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42817332/

相关文章:

java - 无法在 Android Studio 中导入数据绑定(bind)类

Android:数据绑定(bind)文本未更新

android - 禁用屏幕上的按钮 - Android Studio

java - 如何从android中的FireStore中仅检索字段(字段名称)作为列表数组?

android - ActionBarSherlock 侧边菜单抽屉导航

android - 优化 contentProvider 查询以检索联系人姓名和电话

c# - 绑定(bind)到不在代码隐藏中的 RoutedUICommand

javascript - KnockOut.JS 使用 observable 的值填充下拉列表

c# - XAML 绑定(bind)到另一个元素的对立面

android - 如何使用 Android 数据绑定(bind)库制作粗体文本