首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >芯片组中的多行芯片

芯片组中的多行芯片
EN

Stack Overflow用户
提问于 2020-05-09 23:02:58
回答 2查看 4.1K关注 0票数 7

我正在从我的API中获取一个清单,例如德国、英国、法国、意大利等25个国家的标签.我想要2行,每行10 chips,如果下次我得到30个标签,我想要3行10 chips等等.

到目前为止,我还没有找到任何允许我这样做的东西。我快速地看了一下Flexbox-Layout,但是它似乎不符合我的需要,我现在有下面的代码,但是我正在考虑用一个Recyclerview来执行这样的逻辑

片段

代码语言:javascript
复制
viewModel.videoSelected.observe(viewLifecycleOwner, object : Observer<VideoPage> {
            override fun onChanged(videoPage: VideoPage?) {
                videoPage?.tags ?: return
                val chipGroup = binding.chipGroup
                val chipGroupInflater = LayoutInflater.from(chipGroup.context)
                val children = videoPage.tags.map { tagName ->
                    val chip = chipGroupInflater.inflate(R.layout.chip_video_tag, chipGroup, false) as Chip
                    chip.text = tagName
                    chip.tag = tagName
                    chip.setOnClickListener {
                        Toast.makeText(context, tagName, Toast.LENGTH_SHORT).show()
                    }

                    chip
                }

                for (chip in children) {
                    chipGroup.addView(chip)
                }
            }
        })

结果是一条线上的25片芯片。我怎样才能使它在多个线上被分割?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-10 17:22:45

我还用BindingAdapter以一种更简单的方式完成了

代码语言:javascript
复制
 <androidx.recyclerview.widget.RecyclerView
                    app:listVideoTagChip="@{viewModel.videoSelected.tags}"
                    android:id="@+id/rv_video_chips"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    app:layoutManager="androidx.recyclerview.widget.StaggeredGridLayoutManager"
                    android:orientation="horizontal"
                    tools:listitem="@layout/chip_video_tag"/>
代码语言:javascript
复制
private const val TAG_PER_ROW = 10

@BindingAdapter("listVideoTagChip")
fun RecyclerView.bindRecyclerView(data: List<String>?) {
    val adapter: VideoTagAdapter = this.adapter as VideoTagAdapter
    (layoutManager as StaggeredGridLayoutManager).spanCount =
        data?.size?.let {
            ceil(it.toDouble().div(TAG_PER_ROW)).toInt()
        } ?: 1
    adapter.submitList(data)
}
票数 1
EN

Stack Overflow用户

发布于 2020-05-10 00:58:57

如注释所示,您可以在芯片11、21等上使用Flexbox LayoutManager和layout_wrapBefore标志。

或者,如果您重新格式化数据,也可以使用标准的回收视图。

要使用标准回收视图,您需要将数据安排在2D数据结构中,这可以是ArrayList的ArrayList,也可以是数组或一组POJO类。

在外部的Arraylist中,行和内部的Arraylist将在行中显示项目。

因此,RecyclerView项只是生成行的水平线性布局,您可以从内部ArrayList向行中添加芯片

使用生成的2D结构的示例

MainActivity

代码语言:javascript
复制
public class MainActivity extends AppCompatActivity {

    private RecyclerView recyclerView;
    private RAdapter adapter;
    private ArrayList<ArrayList<String>> rowsArrayList;

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

        recyclerView = (RecyclerView) findViewById(R.id.recycler);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(linearLayoutManager);

        rowsArrayList = new ArrayList<>();
        for (int i = 1; i <= 3; i++) {
            ArrayList<String> row = new ArrayList<>();
            for (int j = 1; j <= 10; j++) {
                row.add(String.valueOf(j));
            }
            rowsArrayList.add(row);
        }

        adapter = new RAdapter(this, rowsArrayList);
        recyclerView.setAdapter(adapter);
    }
}

RAdapter

代码语言:javascript
复制
public class RAdapter extends RecyclerView.Adapter<RAdapter.RHolder>{

    class RHolder extends RecyclerView.ViewHolder {
        private LinearLayout line;

        public RHolder(View itemView) {
            super(itemView);
            line = itemView.findViewById(R.id.line);
        }
    }

    private Context context;
    private ArrayList<ArrayList<String>> rowsArrayList;

    public RAdapter(Context context, ArrayList<ArrayList<String>> rowsArrayList) {
        this.context = context;
        this.rowsArrayList = rowsArrayList;
    }

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

    @Override
    public void onBindViewHolder(RHolder holder, int position) {
        // Because we might be recycling the LinearLayout that might have had chips added to it already
        holder.line.removeAllViews();
        ArrayList<String> row = rowsArrayList.get(position);
        for (String text: row) {
            Chip chip = new Chip(context);
            chip.setText(text);
            holder.line.addView(chip);
        }
    }

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

}

row_layout.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/line">

</LinearLayout>

这会产生

更新:

只要再多点数学,你就可以不用重新整理数据就能做这件事。

显示不包括整行的25个项目

MainActivity

代码语言:javascript
复制
public class MainActivity extends AppCompatActivity {

    private RecyclerView recyclerView;
    private RAdapter adapter;
    private ArrayList<String> itemsArrayList;

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

        recyclerView = (RecyclerView) findViewById(R.id.recycler);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(linearLayoutManager);

        itemsArrayList = new ArrayList<>();
        for (int i = 1; i <= 25; i++) {
            itemsArrayList.add(String.valueOf(i));
        }

        adapter = new RAdapter(this, itemsArrayList);
        recyclerView.setAdapter(adapter);
    }
}

RAdapter

代码语言:javascript
复制
public class RAdapter extends RecyclerView.Adapter<RAdapter.RHolder>{

    class RHolder extends RecyclerView.ViewHolder {
        private LinearLayout line;

        public RHolder(View itemView) {
            super(itemView);
            line = itemView.findViewById(R.id.line);
        }
    }

    private Context context;
    private ArrayList<String> itemsArrayList;
    private int itemsPerRow = 10;

    public RAdapter(Context context, ArrayList<String> itemsArrayList) {
        this.context = context;
        this.itemsArrayList = itemsArrayList;
    }

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

    @Override
    public void onBindViewHolder(RHolder holder, int position) {
        // Because we might be recycling the LinearLayout that might have had chips added to it already
        holder.line.removeAllViews();
        int adjustedPosition = position + 1;
        int rangeEnd = Math.min(itemsArrayList.size(), adjustedPosition * itemsPerRow);
        int rangeStart = Math.max((position * itemsPerRow) + 1, rangeEnd - itemsPerRow);
        for (int i = rangeStart; i <= rangeEnd; i++) {
            int arrayPositionAdjusted = i - 1;
            Chip chip = new Chip(context);
            chip.setText(itemsArrayList.get(arrayPositionAdjusted));
            holder.line.addView(chip);
        }
    }

    @Override
    public int getItemCount() {
        return return (int) Math.ceil(itemsArrayList.size()/ (double) itemsPerRow);
    }

}

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61704956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档