ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Android在RecyclerView for DataBinding功能上使用多个不同的行

2019-10-08 23:26:22  阅读:175  来源: 互联网

标签: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);
}

解决方法:

您正试图在实例化视图持有者之前绑定适配器的视图.视图绑定应在onBindViewHolder()中执行.

创建一个扩展RecyclerView.ViewHolder的基本视图持有者类,并具有ShowBookItemsViewHolder和RobotViewHolder实现的抽象绑定(Object obj)方法.感谢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对象传递给子视图持有者以进行绑定:

public class ShowBookItemsViewHolder extends BaseViewHolder {

    ...

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

重写getItemViewType()以使用不同的视图类型提供onCreateViewHolder().例如:

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

使用视图类型构建视图持有者:

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()返回基本视图持有者,并且适配器类扩展了RecyclerView.Adapter< YourAdapter.YourBaseViewHolder>.

标签:android,data-binding,android-databinding
来源: https://codeday.me/bug/20191008/1875091.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有