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