【问题标题】:How can i update item of nested recyclerview item?如何更新嵌套 recyclerview 项目的项目?
【发布时间】:2020-12-05 03:26:12
【问题描述】:

我有一个 recyclerview(parent),它在片段中填充了一些 recyclerviews(child),我想直接从片段中更新每个嵌套的 recyclerviews(child),并使用一个动作(例如单击动作),我该如何以完美而有效的方式做到这一点?

初始父适配器

     ParentAdapter adapter = new ParentAdapter(dataSet);
     mBinding.recyclerView.setAdapter(adapter);

ParentAdapter.java

public class MainAdapter extends RecyclerView.Adapter<MainAdapter.ViewHolder> {

    private final RecyclerView.RecycledViewPool viewPool;
    private List<CartItemCategory> dataSet;

    public MainAdapter(List<CartItemCategory> dataSet) {

        this.dataSet = dataSet;
        
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        ShoppingCardParentItemLayoutBinding mBinding = ShoppingCardParentItemLayoutBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
        return new ViewHolder(mBinding);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        holder.mBinding.setCartItemCategory(dataSet.get(position));

        ChildAdapter childAdapter = new ChildAdapter(dataSet.get(position).getCartItems());
        holder.mBinding.recyclerView.setHasFixedSize(true);
        holder.mBinding.recyclerView.setAdapter(childAdapter);
        holder.mBinding.recyclerView.setRecycledViewPool(viewPool);
    }

    @Override
    public int getItemCount() {
        return dataSet.size();
    }

    class ViewHolder extends RecyclerView.ViewHolder {

        ShoppingCardParentItemLayoutBinding mBinding;

        ViewHolder(@NonNull ShoppingCardParentItemLayoutBinding mBinding) {
            super(mBinding.getRoot());
            this.mBinding = mBinding;
        }
    }

}

ChildAdapter.java

public class ChildAdapter extends RecyclerView.Adapter<InnerAdapter.ViewHolder> {

    private List<CartItem> cartItems;

    public ChildAdapter(List<CartItem> cartItems) {
        this.cartItems = cartItems;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        ShoppingCardItemLayoutBinding mBinding = ShoppingCardItemLayoutBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
        return new ViewHolder(mBinding);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        holder.mBinding.setCartItem(cartItems.get(position));
    }

    @Override
    public int getItemCount() {
        return cartItems.size();
    }

    class ViewHolder extends RecyclerView.ViewHolder {

        ShoppingCardItemLayoutBinding mBinding;

        ViewHolder(@NonNull ShoppingCardItemLayoutBinding mBinding) {
            super(mBinding.getRoot());
            this.mBinding = mBinding;
            }
    }

}

父回收者视图

<androidx.recyclerview.widget.RecyclerView
  android:id="@+id/recycler_view"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
>

子项布局

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    >

    <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recycler_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

【问题讨论】:

    标签: android android-recyclerview nestedrecyclerview


    【解决方案1】:

    在您的子适配器中,您可以像这样创建一些插入、更新、删除等方法:

    public class ChildAdapter extends RecyclerView.Adapter<InnerAdapter.ViewHolder> {
    // ...
    public void update(int position, CartItem newCartItem) {
      cartItems.set(position, newCartItem);
      notifyDataSetChanged();                    // <--- THIS IS THE MAIN THING
    }
    
    public void add(CartItem newCartItem) {
      cartItems.add(newCartItem);
      notifyDataSetChanged();                    // <--- THIS IS THE MAIN THING
    }
    
    public void delete(int position) {
      cartItems.remove(position);
    }
    
    // ...
    }
    

    之后,您可以像这样在按钮单击事件上调用这些方法:

    Button btn = findViewById(R.id.btn);
    btn.setOnClickListener( v -> {
      CartItem cartItem = new CartItem(); // <-- initialize properly
      childAdapter.add(newCartItem); 
    // OR to update
    // childAdapter.update(position,  newCartItem);  // <-- the position where you want to update 
    
    // OR to delete
    // childAdapter.delete(position); // <-- item at position that you want to delete
    
    });
    

    我认为你可以这样做。

    如何访问每个子项的 childAdapter?

    我认为你需要这两样东西:

    1. 获取 RecyclerView 第 i 个位置的 viewHolder
    2. 从 recyclerView 获取适配器

    可以这样访问viewHolder: ViewHolder vh = myRecyclerView.findViewHolderForAdapterPosition(pos);(reference)

    你可以这样获取适配器:ChildAdapter adapter = (ChildAdapter)mRecyclerView.getAdapter();

    所以假设你想从 YourActivity / YourFragment 获取 get childAdapter。通过结合这 2 个,您可以执行以下操作:

    //... inside your activity / fragment
     
    private void myUpdate(int i, int j, CartItem cartItem) {
      // 1. get ith item of the parent recyclerView
      ViewHolder ithChildViewHolder = parentRecyclerView.
                                      findViewHolderForAdapterPosition(pos); 
      // 2. get it's recyclerview
      RecyclerView ithChildsRecyclerView = ithChildViewHolder.
                                           mBinding.
                                           recyclerView;
      // 3. get ithRecyclerView's adapter
      ChildAdapter ithChildAdapter = (ChildAdapter) ithChildsRecyclerView.getAdapter();
    
      // 4. now you should be able to do updates
      //    update at position j with new item
      ithChildAdapter.update( j, newCartItem); 
     
    }
    

    请注意,我在没有项目的情况下编写了它。所以可能会有一些小错误。但它应该是这样的。相应地进行更改。试试这个,让我知道它是否有效。祝你好运。

    【讨论】:

    • 您好,感谢您的回复,如何访问每个子项的 childAdapter?
    • 你好。抱歉回复晚了。我已经更新了我的答案。请检查一下。
    猜你喜欢
    • 1970-01-01
    • 2020-07-05
    • 2020-06-04
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多