(android)如何向当前嵌套的RecyclerView动态添加项

(android)如何向当前嵌套的RecyclerView动态添加项,android,android-recyclerview,Android,Android Recyclerview,这张图片显示了问题所在 我现在正在使用嵌套回收视图 我想要的是,当按下外部回收视图的添加按钮时,将添加内部回收视图的项目 但我做的是,无论按下哪个按钮,最后添加的内部回收视图的项目都会被添加 如何将每个项目添加到正确的RecyclerView位置 这是我的密码 RoutineModel.java RoutineAdapter.java RoutineDetailAdapter RoutineAdapter中的detailAdapter每次调用onCreateViewHolder时都会重新分配,这

这张图片显示了问题所在

我现在正在使用嵌套回收视图

我想要的是,当按下
外部回收视图
的添加按钮时,将添加内部
回收视图
的项目

但我做的是,无论按下哪个按钮,最后添加的
内部回收视图的项目都会被添加

如何将每个项目添加到正确的
RecyclerView
位置

这是我的密码

RoutineModel.java

RoutineAdapter.java

RoutineDetailAdapter


RoutineAdapter
中的
detailAdapter
每次调用
onCreateViewHolder
时都会重新分配,这意味着它将始终指向在
RecyclerView
中创建的最后一个项目的RoutineDetailAdapter

对此的一个修复方法是通过click listener界面传递单击项的
RoutineDetailAdapter

公共类RoutineAdapter扩展了RecyclerView.Adapter{
语境;
ArrayList routineItems=新的ArrayList();
OnRoutineItemClickListener侦听器;
公共无效设置OnRoutineClickListener(OnRoutineItemClickListener侦听器){
this.listener=listener;
}
公共无效附加项(RoutineModel项){
常规项目。添加(项目);
}
public void addDetailItem(RoutineDetailAdapter RoutineDetailAdapter){
addItem(新的RoutineDetailModel());
}
@非空
@凌驾
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType){
context=parent.getContext();
LayoutFlater充气机=LayoutFlater.from(上下文);
视图项视图=充气机。充气(R.layout.routine\u项,父项,false);
ViewHolder=新的ViewHolder(项目视图);
RoutineDetailAdapter detailAdapter=新RoutineDetailAdapter();
holder.setRoutineDetailRecyClerView();
固定器.例行程序\详细信息.设置适配器(详细适配器);
addItem(新RoutineDetailModel());
报税表持有人;
}
@凌驾
public void onBindViewHolder(@NonNull ViewHolder,int位置){
RoutineModel curRoutineItem=routineItems.get(位置);
持有者。设置项目(当前项目);
}
@凌驾
public int getItemCount(){
返回routineItems.size();
}
公共类ViewHolder扩展了RecyclerView.ViewHolder{
文本视图例程;
按钮地址集;
RecyclerView例程_详细信息;
公共视图持有者(@NonNull View itemView){
超级(项目视图);
initViews();
addSet.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
RoutineDetailAdapter RoutineDetailAdapter=(RoutineDetailAdapter)例程_detail.getAdapter();
OnItemClick(routineDetailAdapter);
}
});
}
私有void initViews(){
例程=itemView.findViewById(R.id.routine);
例程_detail=itemviewbyd(R.id.detail_例程);
addSet=itemView.findviewbyd(R.id.add\u集);
}
私有void集合项(RoutineModel routineItem){
setText(routineItem.getRoutine());
}
public void setRoutineDetailRecyClerView(){
例程_detail.setLayoutManager(新的LinearLayoutManager(context,RecyclerView.VERTICAL,false));
例程_详细信息。setHasFixedSize(真);
}
}
RoutineItemClickListener上的公共接口{
public void OnItemClick(RoutineDetailAdapter适配器);
}
}
公共类WriteRoutineActivity扩展了AppCompativeActivity{
RecyclerView例程_RecyclerView;
文本视图标题;
常规适配器;
直线外派经理,直线外派经理;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u write\u例程);
initViews();
setPageTitle(getIntent());
setRoutineRecyclerview();
routineAdapter=新routineAdapter();
例程_recyclerview.setAdapter(routineAdapter);
//添加详细项目
routineAdapter.setOnRoutineClickListener(新routineAdapter.OnRoutineItemClickListener()){
@凌驾
public void OnItemClick(RoutineDetailAdapter RoutineDetailAdapter){
addDetailItem(routineDetailAdapter);
}
});
}
私有void initViews(){
标题=findViewById(R.id.body\u part\u detail\u标题);
routine\u recyclerview=findviewbyd(R.id.routine\u recyclerview);
add_routine_btn=findviewbyd(R.id.add_routine);
}
私有void setRoutineRecyclerview(){
routineLayoutManger=新的LinearLayoutManager(getApplicationContext(),RecyclerView.VERTICAL,false);
常规检查设置布局管理器(RoutineLayoutManager);
例程_recyclerview.setHasFixedSize(true);
}
公共无效添加例程(字符串例程){
addItem(新RoutineModel(例程));
RoutineLayoutManager.scrollToPositionWithOffset(0,0);
}
}

多亏了你,我才解决了这个问题!
public class RoutineModel {
    String routine;

    public RoutineModel(String routine) {
        this.routine = routine;
    }

    public String getRoutine() {
        return routine;
    }
}
public class RoutineAdapter extends RecyclerView.Adapter<RoutineAdapter.ViewHolder> {
    Context context;
    ArrayList<RoutineModel> routineItems = new ArrayList<>();
    public RoutineDetailAdapter detailAdapter;
    OnRoutineItemClickListener listener;

    public void setOnRoutineClickListener(OnRoutineItemClickListener listener) {
        this.listener = listener;
    }

    public void addItem(RoutineModel item) {
        routineItems.add(item);
    }

    public void addDetailItem() {
        detailAdapter.addItem(new RoutineDetailModel());
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        context = parent.getContext();
        LayoutInflater inflater = LayoutInflater.from(context);
        View itemView =  inflater.inflate(R.layout.routine_item, parent, false);
        ViewHolder holder = new ViewHolder(itemView);
        detailAdapter = new RoutineDetailAdapter();
        holder.setRoutineDetailRecyClerView();
        holder.routine_detail.setAdapter(detailAdapter);
        detailAdapter.addItem(new RoutineDetailModel());

        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        RoutineModel curRoutineItem = routineItems.get(position);
        holder.setItems(curRoutineItem);
    }

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

    public class ViewHolder extends RecyclerView.ViewHolder  {
        TextView routine;
        Button addSet;
        RecyclerView routine_detail;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            initViews();

            addSet.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    listener.OnItemClick();
                }
            });
        }

        private void initViews() {
            routine = itemView.findViewById(R.id.routine);
            routine_detail = itemView.findViewById(R.id.detail_routine);
            addSet = itemView.findViewById(R.id.add_set);
        }
        private void setItems(RoutineModel routineItem) {
            routine.setText(routineItem.getRoutine());
        }

        public void setRoutineDetailRecyClerView() {
            routine_detail.setLayoutManager(new LinearLayoutManager(context, RecyclerView.VERTICAL, false));
            routine_detail.setHasFixedSize(true);
        }
    }

    public interface OnRoutineItemClickListener {
        public void OnItemClick();
    }
}
public class RoutineDetailModel {
    String set;
    String weight;
    String reps;
}
public class RoutineDetailAdapter extends  RecyclerView.Adapter<RoutineDetailAdapter.ViewHolder>{
    ArrayList<RoutineDetailModel> items = new ArrayList<>();

    public void addItem(RoutineDetailModel item) {
        items.add(item);
        notifyDataSetChanged();
    }
    public ArrayList<RoutineDetailModel> getItem() {
        return this.items;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View itemView = inflater.inflate(R.layout.routine_detail_item, parent, false);
        return new ViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        RoutineDetailModel item = items.get(position);
        holder.setItem(item);
    }

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

    public class ViewHolder extends RecyclerView.ViewHolder {
        TextView set;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            set = itemView.findViewById(R.id.set);
        }

        private void setItem(RoutineDetailModel item) {
            set.setText("TEST");
        }
    }
}
public class WriteRoutineActivity extends AppCompatActivity {
    RecyclerView routine_recyclerview;
    TextView title;
    RoutineAdapter routineAdapter;
    LinearLayoutManager routineLayoutManger;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_write_routine);

        initViews();
        setPageTitle(getIntent());
        setRoutineRecyclerview();

        routineAdapter = new RoutineAdapter();
        routine_recyclerview.setAdapter(routineAdapter);

        // add detail item
        routineAdapter.setOnRoutineClickListener(new RoutineAdapter.OnRoutineItemClickListener() {
            @Override
            public void OnItemClick() {
                routineAdapter.addDetailItem();
            }
        });
    }

    private void initViews() {
        title = findViewById(R.id.body_part_detail_title);
        routine_recyclerview = findViewById(R.id.routine_recyclerview);
        add_routine_btn = findViewById(R.id.add_routine);
    }

    private void setRoutineRecyclerview() {
        routineLayoutManger = new LinearLayoutManager(getApplicationContext(), RecyclerView.VERTICAL, false);
        routine_recyclerview.setLayoutManager(routineLayoutManger);
        routine_recyclerview.setHasFixedSize(true);
    }

    public void addRoutine(String routine) {
        routineAdapter.addItem(new RoutineModel(routine));
        routineLayoutManger.scrollToPositionWithOffset(0, 0);
    }
}