Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何更新嵌套的recyclerview项的项?_Android_Android Recyclerview_Nestedrecyclerview - Fatal编程技术网

Android 如何更新嵌套的recyclerview项的项?

Android 如何更新嵌套的recyclerview项的项?,android,android-recyclerview,nestedrecyclerview,Android,Android Recyclerview,Nestedrecyclerview,我有一个在片段中填充了一些recyclerviews(子)的recyclerviews(父级),我想用一个操作(例如单击操作)直接从片段更新每个嵌套的recyclerviews(子级),如何以完美而高效的方式做到这一点 初始父适配器 ParentAdapter adapter = new ParentAdapter(dataSet); mBinding.recyclerView.setAdapter(adapter); ParentAdapter.java public

我有一个在片段中填充了一些recyclerviews(子)的recyclerviews(父级),我想用一个操作(例如单击操作)直接从片段更新每个嵌套的recyclerviews(子级),如何以完美而高效的方式做到这一点

初始父适配器

     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;
        }
    }

}

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;
            }
    }

}
公共类MainAdapter扩展了RecyclerView.Adapter{ private final RecyclerView.RecycledViewPool视图池; 私有列表数据集; 公共主适配器(列表数据集){ this.dataSet=数据集; } @非空 @凌驾 public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType){ ShoppingCardParentItemLayoutBinding mBinding=ShoppingCardParentItemLayoutBinding.inflate(LayoutFlater.from(parent.getContext()),parent,false); 返回新的ViewHolder(mBinding); } @凌驾 public void onBindViewHolder(@NonNull ViewHolder,int位置){ holder.mBinding.setCartItemCategory(dataSet.get(position)); ChildAdapter=new-ChildAdapter(dataSet.get(position.getCartItems()); holder.mBinding.recyclerView.setHasFixedSize(true); holder.mBinding.recyclerView.setAdapter(childAdapter); holder.mBinding.recyclerView.setRecycleredViewPool(viewPool); } @凌驾 public int getItemCount(){ 返回dataSet.size(); } 类ViewHolder扩展了RecyclerView.ViewHolder{ 购物卡ParentItemLayoutBinding; ViewHolder(@NonNull ShoppingCardParentItemLayoutBinding-mBinding){ super(mBinding.getRoot()); this.mBinding=mBinding; } } } ChildAdapter.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;
        }
    }

}

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;
            }
    }

}
公共类ChildAdapter扩展了RecyclerView.Adapter{ 私人物品清单; 公共子适配器(列表项){ this.cartItems=cartItems; } @非空 @凌驾 public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType){ ShoppingCardItemLayoutBinding mBinding=ShoppingCardItemLayoutBinding.inflate(LayoutFlater.from(parent.getContext()),parent,false); 返回新的ViewHolder(mBinding); } @凌驾 public void onBindViewHolder(@NonNull ViewHolder,int位置){ holder.mBinding.setCartItem(cartItems.get(position)); } @凌驾 public int getItemCount(){ 返回cartItems.size(); } 类ViewHolder扩展了RecyclerView.ViewHolder{ 购物卡布局装订; 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>

在子适配器中,您可以创建一些插入、更新、删除等方法,如下所示:

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

});
//... 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?您好。对不起,迟了答复。我已经更新了我的答案。请检查一下。