android - 有没有一种方法可以为每个视图使用多个变量(不同的数据类型)在相同的布局中实现数据绑定?
问题描述
所以我的问题是:我有 2 个片段(A 和 B),每个片段都有一个 recyclerview 列表。两个列表使用相同的卡片视图。片段 A 列表使用 Pizza 对象填充列表,片段 B 使用 Drink 对象填充列表。我应该如何在卡片视图布局中实现数据绑定,以便在第一个列表中包含比萨饼,在第二个列表中包含饮品(从片段 A 滑动到片段 B)?
<data>
<variable
name="foodItem"
type="model.Pizza" />
<variable
name="drinkItem"
type="model.Drink" />
</data>
<TextView
android:id="@+id/productName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@color/colorAccent"
android:textSize="@dimen/card_view_text_view_text_size"
android:textStyle="bold"
android:text="@{foodItem.name}" !!! here i want to use drinkItem if i swipe to drink list and foodItem if i swipe to Pizza list !!
/>
更新
适配器代码:
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater=LayoutInflater.from(parent.getContext());
if (fragName.equals("Food") || fragName.equals("Drink")) {
RecyclerCardviewItemBinding view= DataBindingUtil.inflate(inflater,R.layout.recycler_cardview_item,parent,false);
return new MenuViewHolder(view, fragName, clickListener);
} else {
RecyclerCardviewItemBinding view= DataBindingUtil.inflate(inflater,R.layout.recycler_order_item,parent,false);
return new OrderViewHolder(view, iOrderClickListener);
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { //adds the data to the card views
if (fragName.equals("Food")) {
((MenuViewHolder) holder).bind(pizzaList.get(position),holder);
} else if (fragName.equals("Drink")) {
((MenuViewHolder) holder).bind(drinkList.get(position),holder);
} else if (fragName.equals("Order")) {
((OrderViewHolder) holder).bind(orderList.get(position),holder);
}
}
视图支架(我有 2 个视图支架)
public MenuViewHolder(@NonNull RecyclerCardviewItemBinding itemView, String fragName, IMenuClickListener iMenuClickListener) {
super(itemView.getRoot());
ButterKnife.bind(this, itemView.getRoot());
// cardView = itemView;
this.fragName = fragName;
this.clickListener = iMenuClickListener;
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int position = getAdapterPosition();
clickListener.addButtonClick(position);
}
});
}
public void bind(Object item,RecyclerView.ViewHolder holder) {
if (item instanceof Pizza) {
Pizza pizza = (Pizza) item;
holder.itemView. //HOW SHOULD I BIND PIZZA ITEM TO LAYOUT HERE?
/*Glide.with(infoImage.getContext()).load(pizza.getImageLink()).error(R.mipmap.ic_launcher).into(infoImage);
cardView.setTag(pizza);
// productName.setText(pizza.getName());
productPrice.setText(pizza.getPrice().toString());*/
cardView.setOnClickListener(this);
} else {
Drink drink = (Drink) item;
/* Glide.with(infoImage.getContext()).load(drink.getImageLink()).error(R.mipmap.ic_launcher).into(infoImage);
cardView.setTag(drink);
// productName.setText(drink.getName());
productPrice.setText(drink.getPrice().toString());*/
cardView.setOnClickListener(this);
}
}
解决方案
最简单的方法是制作一个界面(比如说FoodInterface
)
<data>
<variable
name="item"
type="com.package.FoodInterface" />
</data>
<TextView
android:id="@+id/productName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@color/colorAccent"
android:textSize="@dimen/card_view_text_view_text_size"
android:textStyle="bold"
android:text="@{item.name}"
/>
MyInterface 可能看起来像,
interface MyInterface{
fun foodName(): String
}
模型将是,
class Pizza: MyInterface{
fun foodName():String{
return "pizze name"
}
}
class Drink: MyInterface{
fun foodName():String{
return "drink name"
}
}
最后,您将分配接口(来自您的模型)以进行绑定。
推荐阅读
- wso2 - WSO2 EI - API 上下文无法识别
- javascript - 流式使用备忘录钩子
- parallel-processing - 将功能分配给多个任务
- c# - Windows 服务无法访问网络驱动器路径 asp.net
- r - 如何将 xlsx 文件读入 R 并将其转换为 tsibble 对象?
- docker - 在 docker compose 中使用包含“,”的 shell 命令
- apache-kafka - 在 python 中聚合 Kafka 记录
- c++ - 如何使用 If 和 else 语句在向量中搜索
- windows - 通过版本 10.0.2-internal 的 JavaFX 运行时使用版本 11.0.1 的 JavaFX API 加载 FXML 文档
- android - 如何安装两个具有相同包名的Android应用程序