代码之家  ›  专栏  ›  技术社区  ›  user2511882

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

  •  0
  • user2511882  · 技术社区  · 7 年前

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

    例如:

    宝马

    V6,涡轮增压器---标签

    商品

    V8,双涡轮增压,碳纤维---标签

    标签在 JSON 响应,可以是可变数字。但是,标题 回收视图 只有一个 textView 在任何时候。

    我当前的代码有一个简单的 回收视图 在这里我可以显示各种汽车的名称,但是我不确定如何根据响应动态添加固定标题下的各种标签。

    代码:

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

    感谢您的帮助。谢谢!

    1 回复  |  直到 7 年前
        1
  •  1
  •   Ranjan    7 年前

    在我看来,这也在一定程度上取决于你的用户界面。如果只想以逗号分隔的格式显示标记,可以通过标记数组循环并使用 StringBuilder TextView .

    recyclerView 回收视图

    选项1:

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

    RV .在这种情况下,父列表项XML将如下所示。

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

    recyclerview onBindViewHolder