如何在Android中将ArrayList的所有元素显示为Chips
How to display all the elements of ArrayList as Chips in Android
我有一个 ArrayList<String>
这样的 [Angularjs, JavaScript, Css]
在我的适配器中,我从另一个 Intent 获得了 ArrayList
标签。我尝试使用以下方法将 ArrayList
的所有元素显示为 Chips,但我只得到 ArrayList 的最后一个元素。我只看到 one Chip 和 ArrayList 的最后一个元素。
for (String tag: card.getTags()) {
Log.d(TAG, "tag - " + tag);
holder.tags.setText(tag);
}
任何人都可以指导,我如何更改我的代码以将 ArrayList 的所有元素显示为 Chips
。
目前,您正在更换支架的 forEach
循环中的 tags
。您只有一个持有人并不断更新直到循环结束;这就是你最后 chip/tag
的原因
如果您指的是 ChipGroup 的 MaterialComponents。
ChipGroup chipGroup = new ChipGroup(parentView.getContext());
String[] genres = {"Thriller", "Comedy", "Adventure"};
for(String genre : genres) {
Chip chip = new Chip(parentView.getContext());
chip.setText(genre);
chipGroup.addView(chip);
}
我认为您一定是在使用 RecyclerView
,因为我在您的代码段中看到了 holder。
以下是视图层次结构;我假设你正在努力实现;如果没有,那么您可以使用相同的逻辑行来移动这些部分
- RecyclerView
- 每个Item/View
- 标签 - 使用多个标签
FlowLayout
- 在视图中添加多个标签
您需要 bind
RecyclerView 中的每个项目。
@Override
public void onBindViewHolder(final YourViewHolder holder, final int position) {
...
// assuming you have FlowLayout in recyclerview view item
// do add holder pattern to flowlayout as well
fillAutoSpacingLayout(card.getTags(), holder.flowLayout);
}
我在这里使用 FlowLayout 在 RecyclerView 的每个视图中添加芯片或标签。
在 onBindViewHolder:
中绑定每个 item/View
private void fillAutoSpacingLayout(ArrayList<String> tags, FlowLayout flowLayout) {
for (String tag : tags) {
TextView textView = buildLabel(tag);
flowLayout.addView(textView);
}
}
private TextView buildLabel(String text) {
TextView textView = new TextView(this);
textView.setText(text);
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);
textView.setPadding((int)dpToPx(16), (int)dpToPx(8), (int)dpToPx(16), (int)dpToPx(8));
textView.setBackgroundResource(R.drawable.label_bg);
return textView;
}
private float dpToPx(float dp){
return TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, dp, getResources().getDisplayMetrics());
}
此外,您可以参考这个SO question,因为它在同一行。
如果你说的是Chips。
在 xml 布局中添加一个 ChipGroup
要显示筹码的位置
<com.google.android.material.chip.ChipGroup
android:id="@+id/chipGroup"
android:layout_width="match_parent"
app:chipSpacingVertical="2dp"
android:layout_height="wrap_content"/>
现在您可以使用此方法将 ArrayList 添加为 ChipGroup
中的 Chip
:
private void addChip(String pItem, ChipGroup pChipGroup) {
Chip lChip = new Chip(this);
lChip.setText(pItem);
lChip.setTextColor(getResources().getColor(R.color.primary_text));
lChip.setChipBackgroundColor(getResources().getColorStateList(R.color.chip_bg));
pChipGroup.addView(lChip, pChipGroup.getChildCount() - 1);
}
我有一个 ArrayList<String>
这样的 [Angularjs, JavaScript, Css]
在我的适配器中,我从另一个 Intent 获得了 ArrayList
标签。我尝试使用以下方法将 ArrayList
的所有元素显示为 Chips,但我只得到 ArrayList 的最后一个元素。我只看到 one Chip 和 ArrayList 的最后一个元素。
for (String tag: card.getTags()) {
Log.d(TAG, "tag - " + tag);
holder.tags.setText(tag);
}
任何人都可以指导,我如何更改我的代码以将 ArrayList 的所有元素显示为 Chips
。
目前,您正在更换支架的 forEach
循环中的 tags
。您只有一个持有人并不断更新直到循环结束;这就是你最后 chip/tag
如果您指的是 ChipGroup 的 MaterialComponents。
ChipGroup chipGroup = new ChipGroup(parentView.getContext());
String[] genres = {"Thriller", "Comedy", "Adventure"};
for(String genre : genres) {
Chip chip = new Chip(parentView.getContext());
chip.setText(genre);
chipGroup.addView(chip);
}
我认为您一定是在使用 RecyclerView
,因为我在您的代码段中看到了 holder。
以下是视图层次结构;我假设你正在努力实现;如果没有,那么您可以使用相同的逻辑行来移动这些部分
- RecyclerView
- 每个Item/View
- 标签 - 使用多个标签
FlowLayout
- 在视图中添加多个标签
- 标签 - 使用多个标签
- 每个Item/View
您需要 bind
RecyclerView 中的每个项目。
@Override
public void onBindViewHolder(final YourViewHolder holder, final int position) {
...
// assuming you have FlowLayout in recyclerview view item
// do add holder pattern to flowlayout as well
fillAutoSpacingLayout(card.getTags(), holder.flowLayout);
}
我在这里使用 FlowLayout 在 RecyclerView 的每个视图中添加芯片或标签。
在 onBindViewHolder:
中绑定每个 item/Viewprivate void fillAutoSpacingLayout(ArrayList<String> tags, FlowLayout flowLayout) {
for (String tag : tags) {
TextView textView = buildLabel(tag);
flowLayout.addView(textView);
}
}
private TextView buildLabel(String text) {
TextView textView = new TextView(this);
textView.setText(text);
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);
textView.setPadding((int)dpToPx(16), (int)dpToPx(8), (int)dpToPx(16), (int)dpToPx(8));
textView.setBackgroundResource(R.drawable.label_bg);
return textView;
}
private float dpToPx(float dp){
return TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, dp, getResources().getDisplayMetrics());
}
此外,您可以参考这个SO question,因为它在同一行。
如果你说的是Chips。
在 xml 布局中添加一个 ChipGroup
要显示筹码的位置
<com.google.android.material.chip.ChipGroup
android:id="@+id/chipGroup"
android:layout_width="match_parent"
app:chipSpacingVertical="2dp"
android:layout_height="wrap_content"/>
现在您可以使用此方法将 ArrayList 添加为 ChipGroup
中的 Chip
:
private void addChip(String pItem, ChipGroup pChipGroup) {
Chip lChip = new Chip(this);
lChip.setText(pItem);
lChip.setTextColor(getResources().getColor(R.color.primary_text));
lChip.setChipBackgroundColor(getResources().getColorStateList(R.color.chip_bg));
pChipGroup.addView(lChip, pChipGroup.getChildCount() - 1);
}