首页 > 解决方案 > 有没有一种方法可以为每个视图使用多个变量(不同的数据类型)在相同的布局中实现数据绑定?

问题描述

所以我的问题是:我有 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);

        }

    }

标签: androidandroid-fragmentsandroid-recyclerviewdata-binding

解决方案


最简单的方法是制作一个界面(比如说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"
 }
}

最后,您将分配接口(来自您的模型)以进行绑定。


推荐阅读