Отображение элементов в ListViews внутри RecyclerView

1

У меня есть List<CopyModel> copyData со всеми моими данными, которые я хочу отобразить.
Класс CopyModel выглядит следующим образом:

public class CopyModel {
  public String autoId;
  public List<String> fieldNames;
  public List<Object> values;
}

Я хочу отобразить элементы fieldNames и values.
Точные данные, которые я получаю из FireStore:

Изображение 174551

Я отображаю их в ListView, с simple_list_item_2.
Вот код:

@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
    ArrayAdapter adapter = new ArrayAdapter(mContext, android.R.layout.simple_list_item_2, android.R.id.text1, copyData) {
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view = super.getView(position, convertView, parent);
            TextView t1 = view.findViewById(android.R.id.text1);
            TextView t2 = view.findViewById(android.R.id.text2);

            String tS1 = copyData.get(position).fieldNames.get(position);
            t1.setText(tS1);

            String tS2 = String.valueOf(copyData.get(position).values.get(position));
            t2.setText(tS2);

            return view;
        }
    };
    holder.copyList.setAdapter(adapter);
}

Текущее поведение: RecyclerView показывает 3 ListViews с:

  • copyData0.fieldNames0 => "по умолчанию"
  • copyData0.values0 => "false"
  • copyData1.fieldNames1 => "Pont"
  • copyData1.fieldNames1 => "9"
  • copyData1.fieldNames1 => "entity_name"
  • copyData1.fieldNames1 => "Analízis pontok"

Как я хочу, чтобы это работало:
RecyclerView будет показывать столько же списков, сколько и размер copyData (в данном случае 3), и каждый ListView будет иметь столько же строк, сколько размер его fieldNames (теперь это 5, но может быть любым другим)

РЕДАКТИРОВАТЬ:

    String tS1 = copyData.get(holder.getAdapterPosition()).fieldNames.get(position);
    t1.setText(tS1);

    String tS2 = String.valueOf(copyData.get(holder.getAdapterPosition()).values.get(position));
    t2.setText(tS2);

Теперь я получаю 3 отдельных объекта в 3 отдельных списках, но только первые 3 значения из fieldNames и values

РЕДАКТИРОВАТЬ № 2:

    @Override
public void onBindViewHolder(final ViewHolder holder, final int position) {

    for (int i = 0;i<copyData.size();i++) {
        final List<String> names = copyData.get(i).fieldNames;
        final List<Object> values = copyData.get(i).values;

        //noinspection unchecked
        final ArrayAdapter adapter = new ArrayAdapter(mContext, android.R.layout.simple_list_item_2, android.R.id.text1, names) {
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                View view = super.getView(position, convertView, parent);
                TextView t1 = view.findViewById(android.R.id.text1);
                TextView t2 = view.findViewById(android.R.id.text2);

                String tS1 = names.get(position);
                t1.setText(tS1);
                String tS2 = String.valueOf(values.get(position));
                t2.setText(tS2);

                return view;
            }
        };
        holder.copyList.setAdapter(adapter);
    }
}

Таким образом, я могу добавить каждую пару fieldname-value в список, но он ведет себя так, как будто проходит через эти 2 строки
final List<String> names = copyData.get(i).fieldNames; final List<Object> values = copyData.get(i).values;
3 раза, затем отображает все пары имя-значение-поля последнего объекта в 3 отдельных ListViews

Теги:
android-recyclerview
listview
android-listview

1 ответ

0

На первый взгляд, проблема в том, что

 String tS1 = copyData.get(position).fieldNames.get(position);

Здесь вы используете position которая является позицией Listview Adapters. поэтому ваше выражение должно

 String tS1 = copyData.get(Recycleview Adapter Position).fieldNames.get(Listview adapter position);

Из вашего редактирования:

Теперь я получаю 3 отдельных объекта, в 3 отдельных просмотр списка, но только первые 3 значения

Причина:

Ваш первый адаптер (адаптер Recyleview) работает только три раза.

Если я понимаю ваш вопрос. вам нужно сделать что-то вроде этого:

1) установите свой Recycleview со списком copyData (что вы делаете правильно).

2) в onBindViewHolder вашего повторного просмотра. создайте полный список fieldNames и Values и установите свой адаптер Listview

@Override
    public void onBindViewHolder(ViewHolder holder, final int position) {
    YourCustomeListViewAdapter adapter = new YourCustomeListViewAdapter(younewlistwithfieldNamesandvalue)
        holder.copyList.setAdapter(adapter);
    }

РЕДАКТИРОВАТЬ 2

Вы перебираете copyData. что неправильно.

  for (int i = 0;i<copyData.size();i++) 

вам нужно перебрать имя поля и значения массива.

@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
 for (int i = 0;i<copyData.get(position).fieldNames.size();i++) {
  }
 for (int i = 0;i<copyData.get(position).values.size();i++) {
  }
}
  • 0
    Recycleview Adapter Position - это «позиция» для меня, этот код находится в моем файле «CopyRecyclerViewAdapter.java», но я действительно не знаю, как мне получить позицию адаптера. Или, если «позиция» - это позиция адаптера ListView, то как я могу получить позицию RecyclerView?
  • 0
    @ MátéAntal Вы правильно настраиваете Listview's Adapter RecycleView's adapter внутри Listview's Adapter RecycleView's adapter ?
Показать ещё 9 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню