具有基于响应的动态元素的 RecyclerView

RecyclerView with dynamic elements based on response

我正在尝试创建一个 RecyclerView 来显示汽车列表以及每个行项目的各种标签。

例如:

宝马

v6,turbo ---> 标签

雇佣兵

V8,Twin-turbo,Carbon-Fiber ---> 标签

问题是标签是在 JSON 响应中检索的,并且可以是可变数量。但是,RecyclerView 的标题始终只有一个 textView

我当前的代码有一个简单的 RecyclerView,我可以在其中显示各种汽车的名称,但是我不确定如何在基于固定标题的下方动态添加各种​​标签关于回应。

代码:

 public class ListItemRecyclerViewAdapter extends RecyclerView.Adapter<ListItemRecyclerViewAdapter.ViewHolder>{
        private List<BaseItem> listOfItems = new ArrayList<>();
        private final List<TextView> textViewPool = new LinkedList<>();
        public ListItemRecyclerViewAdapter(List<BaseItem> listItems){

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

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

        @Override
        public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
            holder.carName.setText(((NewsItem)listOfItems.get(position)).getCar());


           Categories categories = ((ListItem)listOfItems.get(position)).getCategories();
           List<String> categoriesList = categories.getCategories();
            holder.bindViewForChips(categoriesList);
        }



        @Override
        public void onViewRecycled(@NonNull NewsViewHolder holder) {
            super.onViewRecycled(holder);
            holder.recycleTextViews();
        }

        // Clean all elements of the recycler
        private void clear() {
            listOfItems.clear();
        }

        public void addAll(List<BaseItem> list) {
            clear();
            listOfItems.addAll(list);
            notifyDataSetChanged();
        }

  class ViewHolder extends RecyclerView.ViewHolder{

        @BindView(R.id.car)
        TextView carName;

        private final List<TextView> textViews = new ArrayList<>();
        private final ViewGroup container;

        ViewHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this,itemView);
            container = (ViewGroup) itemView;
        }

        private void bindViewForChips(List<String> categories){
            recycleTextViews();
            for (int i = 0; i < categories.size(); i++) {
                final TextView textView = getRecycledTextViewOrCreate();
                textViewPool.add(textView);
                container.addView(textView);
            }
        }

        private TextView getRecycledTextViewOrCreate() {
          //  if (textViewPool.isEmpty()) {
                return (TextView)LayoutInflater.from(container.getContext()).inflate(R.layout.chips_view, container, false);
            //}
            //return textViewPool.remove(0);
        }

        public void recycleTextViews() {
            textViewPool.addAll(textViews);
            textViews.clear();
            container.removeAllViews();
        }
    }
    }

感谢任何帮助。谢谢!

IMO 这在某种程度上也取决于您的 UI。如果您只想以逗号分隔格式显示标签,您可以遍历标签数组并使用 StringBuilder 创建一个字符串并将其分配给 TextView.

您也可以在 recyclerView 中使用 recyclerView,但我认为对于这种情况,这可能有点矫枉过正。如果标签是可点击的,你可以选择这个选项。这样您也可以为每个标签元素设置样式。或者交错列表也可能看起来不错。

选项 1: 在单个 TextView 中显示所有标签。在这种情况下,您的列表项 xml 将是这样的。

<TextView>BMW</TextView>
<TextView>ConcatenatedTagsFromArray</TextView>

选项 2: 在 child RV 中显示标签。在那种情况下 parent 列表项 xml 将是这样的。

<TextView>BMW</TextView>
<recyclerView>childRecyclerViewID</recyclerView>

然后在 parent RVonBindViewHolder 方法中创建一个 recyclerview object 并设置布局管理器和适配器并将标签数组作为数据传递。您还需要一个新的列表项 xml 用于 child 回收站视图的项目(但是您希望您的标签看起来像)。