Android 如何更新嵌套的recyclerview项的项?
我有一个在片段中填充了一些recyclerviews(子)的recyclerviews(父级),我想用一个操作(例如单击操作)直接从片段更新每个嵌套的recyclerviews(子级),如何以完美而高效的方式做到这一点 初始父适配器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
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?您好。对不起,迟了答复。我已经更新了我的答案。请检查一下。