Как отобразить все элементы ArrayList в виде чипов в Android - PullRequest
0 голосов
/ 03 октября 2019

У меня есть ArrayList<String>, как это [Angularjs, JavaScript, Css]

В моем адаптере, где я получаю ArrayList тегов из другого намерения. Я попытался отобразить все элементы ArrayList как Chips с помощью подхода, описанного ниже, но я получил только последний элемент ArrayList. Я вижу только один чип с последним элементом ArrayList.

for (String tag: card.getTags()) {
  Log.d(TAG, "tag - " + tag);
  holder.tags.setText(tag);
}

Может кто-нибудь подсказать, как мне изменить мой код, чтобы отображать все элементы ArrayList как Chips.

Ответы [ 2 ]

1 голос
/ 03 октября 2019

Если вы говорите о фишках .

Добавьте ChipGroup в xml-макет, где вы хотите показать свои фишки

<com.google.android.material.chip.ChipGroup
 android:id="@+id/chipGroup"
 android:layout_width="match_parent"
 app:chipSpacingVertical="2dp"
 android:layout_height="wrap_content"/>

Теперь вы можете использовать этот метод, чтобы добавить свой ArrayList как Chip в ChipGroup:

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);
  }
1 голос
/ 03 октября 2019

В настоящее время вы заменяете tags в вашей forEach петле держателя. У вас есть только один держатель, и вы продолжаете обновлять его до окончания цикла;по этой причине у вас есть последний chip/tag

Если вы имеете в виду ChipGroup Материалов.

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 как я вижу держатель в вашем фрагменте.

Ниже приведена иерархия представлений;Я предполагаю, что вы пытаетесь достичь;если нет, то вы можете использовать ту же логику для перемещения по этим частям

  • RecyclerView
    • Каждый элемент / представление
      • Теги - множественные теги с использованием 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:

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

Более того, вы можете обратиться кэто ТАК вопрос , как он на тех же строках.

...