首页 > 解决方案 > 如何制作 RecyclerView 项目的子项的动态列表

问题描述

在我的 RecyclerView 中,我想要动态数量的项目,这些项目是我的 RecyclerView 中每个项目的子项。我临时做了额外的布局并将它们的可见性设置为消失,然后在按下添加按钮时将它们变为可见,但我知道这不是一个好习惯。我不认为嵌套在 RecyclerView 中的 ListView 是正确的。如果是,那么请告诉我我将如何去做。注意:由于某种原因,我无法在代码片段中显示我的代码的第一行

运动适配器

public class ExerciseAdapter extends RecyclerView.Adapter<ExerciseAdapter.ExerciseAdapterViewHolder> {

    private List<Exercise> mExerciseList;
    private static int counter = 0;

    public class ExerciseAdapterViewHolder extends RecyclerView.ViewHolder  {
        final TextView anotherSetTextview;
        final LinearLayout linearLayout4;
        final LinearLayout linearLayout5;

        ExerciseAdapterViewHolder(View view) {
            super(view);
            anotherSetTextview = view.findViewById(R.id.another_set);
            linearLayout4 = view.findViewById(R.id.layout4);
            linearLayout5 = view.findViewById(R.id.layout5);
        }
    }

    @Override
    public ExerciseAdapterViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
        Context context = viewGroup.getContext();
        int layoutIdForListItem = R.layout.list_item_cardview;
        LayoutInflater inflater = LayoutInflater.from(context);

        View view = inflater.inflate(layoutIdForListItem, viewGroup, false);
        return new ExerciseAdapterViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final ExerciseAdapterViewHolder holder, int position) {
        Exercise currentExercise = mExerciseList.get(position);
        String count = Integer.toString(position + 1) + ".";
        holder.anotherSetTextview.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                counter++;
                if(counter==1)
                    holder.linearLayout4.setVisibility(View.VISIBLE);
                else if(counter==2)
                    holder.linearLayout5.setVisibility(View.VISIBLE);
            }
        });

    }

    @Override
    public int getItemCount() {
        if (null == mExerciseList) return 0;
        return mExerciseList.size();
    }

    public void setExerciseData(List<Exercise> exerciseData) {
        mExerciseList = exerciseData;
        notifyDataSetChanged();
    }

    public void addNewExercise(Exercise e){
        mExerciseList.add(e);
        notifyDataSetChanged();
    }
}

我正在为我的班级制作一个锻炼跟踪器应用程序,我希望用户根据需要添加练习,然后他们根据需要为每个练习添加集合。基本上,RecyclerView 中的每个练习对象都需要有自己的动态数量的 Set 对象作为子对象。到目前为止我所拥有的这个屏幕截图应该有助于可视化我的目标。我还是新手,所以请原谅我的格式不佳。

到目前为止我得到了什么

标签: androidandroid-recyclerview

解决方案


您可以在回收站视图项中动态扩展视图。只需在 R.layout.list_item_cardview布局中有一个线性布局,创建一个您想要的数据作为另一个布局并根据需要扩展子布局。

public class ExerciseAdapter 
extendsRecyclerView.Adapter<ExerciseAdapter.ExerciseAdapterViewHolder> {

private List<Exercise> mExerciseList;

public class ExerciseAdapterViewHolder extends RecyclerView.ViewHolder  {
    final TextView anotherSetTextview;
    final LinearLayout layout;

    ExerciseAdapterViewHolder(View view) {
        super(view);
        anotherSetTextview = view.findViewById(R.id.another_set);
        layout = view.findViewById(R.id.layout);
    }
}

@Override
public ExerciseAdapterViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
    Context context = viewGroup.getContext();
    int layoutIdForListItem = R.layout.list_item_cardview;
    LayoutInflater inflater = LayoutInflater.from(context);

    View view = inflater.inflate(layoutIdForListItem, viewGroup, false);
    return new ExerciseAdapterViewHolder(view);
}

@Override
public void onBindViewHolder(final ExerciseAdapterViewHolder holder, int position) {
    final Exercise currentExercise = mExerciseList.get(position);

    for(int i=0;i<currentExercise.count;i++)
    {
        LayoutInflater inflater = LayoutInflater.from(holder.itemView.getContext());
        LinearLayout linearLayout = inflater.inflate(R.layout.child, null);
        holder.layout.addView(linearLayout);
    }
    holder.anotherSetTextview.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            currentExercise.count++;
            notifyDataSetChanged();
        }
    });

}

@Override
public int getItemCount() {
    if (null == mExerciseList) return 0;
    return mExerciseList.size();
}

public void setExerciseData(List<Exercise> exerciseData) {
    mExerciseList = exerciseData;
    notifyDataSetChanged();
}

public void addNewExercise(Exercise e){
    mExerciseList.add(e);
    notifyDataSetChanged();
}

}


推荐阅读