【问题标题】:How to interact with Viewmodel inside recyclerview adapter?如何与 recyclerview 适配器中的 Viewmodel 交互?
【发布时间】:2020-09-26 14:10:17
【问题描述】:

我见过类似的问题,但对我没有帮助。我会尽量具体说明我的问题。我的购物车中有产品列表。当我搜索产品时,我希望为购物车中已存在的商品禁用“添加到购物车”按钮。

购物车项目列表在我的视图模型中。

我是这样接近的—— 当针对特定位置调用 onBindViewHolder 时,我需要搜索当前商品(产品)是否存在于购物车中的商品列表中,如果存在则禁用 Button。

我的问题是购物车在 Viewmodel 中,我发现自己无法从 OnBindViewholder 方法调用 viewmodel。

有没有更好的方法来做到这一点?

@Override
public void onBindViewHolder(@NonNull ProductAdapter.OurViewHolder viewHolder, int i) {
    Products currentItem = adapterData.get(i);
    viewHolder.productNamesFragmentItemsBinding.setProductName(currentItem);
    if (currentItem.getPhotoUris() != null) {
    Picasso.get().load(currentItem.getPhotoUris().get(0)).into(viewHolder.productNamesFragmentItemsBinding.ivProductImage);

    //  now i want to search if current item is present in cart (cart is in viewModel), if item
        // is present in cart then disable "Add to Cart" button for current position
        
        //--------------todo : how to do it ??? -----------------------------------
    }
}

【问题讨论】:

  • 附上您尝试过的代码。
  • 我没有写完整的代码但我已经更新了,请查看

标签: android mvvm


【解决方案1】:

使用 ViewModelProvider 初始化。您可以在构造函数中进行一次这样的初始化(对不起命名,我为一个项目编写了这段代码。我只是从那里复制粘贴:()

    public class CartChildAdapter extends RecyclerView.Adapter<CartChildAdapter.CartHolder> {
    
        private ShoppingCartWishListViewModel shoppingCartWishListViewModel;
    
        public CartChildAdapter(Context context) {
            // this is the line you are looking for. Cast context with FragmentActivity
            this.shoppingCartWishListViewModel = new ViewModelProvider((FragmentActivity)context).get(ShoppingCartWishListViewModel.class);
        }
    
     
        @Override
        public void onBindViewHolder(@NonNull CartChildAdapter.CartHolder holder, int position) {
           // call from here
           this.shoppingCartWishListViewModel.getMyProduct(your parameters may be).observe(this,..){
             ......... Your Codes           
}
 }

【讨论】:

  • 这是一个专业的设计,还是只是一种解决方法?或者更好的方法来做到这一点?在适配器中使用视图模型是一种好习惯吗?。
  • 不确定。但是我们在生产中使用它。任何用户都没有问题。在测试阶段没有遇到任何内存泄漏问题或其他问题。所以我认为你可以使用它
猜你喜欢
  • 2019-02-04
  • 2013-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-22
  • 2020-07-29
  • 1970-01-01
相关资源
最近更新 更多