Android 在 RecyclerView 上使用多个不同的行来实现数据绑定功能
Android use multiple different row on RecyclerView for DataBinding feature
基本上我可以在 recyclerview 适配器上使用多行而不会出现任何问题,例如此代码:
@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
的基础视图持有者 class 并具有 ShowBookItemsViewHolder
和 RobotViewHolder
实现的抽象 bind(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()
returns 基础视图支架和适配器 class 延伸 RecyclerView.Adapter<YourAdapter.YourBaseViewHolder>
.
基本上我可以在 recyclerview 适配器上使用多行而不会出现任何问题,例如此代码:
@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
的基础视图持有者 class 并具有 ShowBookItemsViewHolder
和 RobotViewHolder
实现的抽象 bind(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()
returns 基础视图支架和适配器 class 延伸 RecyclerView.Adapter<YourAdapter.YourBaseViewHolder>
.