У меня есть List<CopyModel> copyData
со всеми моими данными, которые я хочу отобразить.
Класс CopyModel выглядит следующим образом:
public class CopyModel {
public String autoId;
public List<String> fieldNames;
public List<Object> values;
}
Я хочу отобразить элементы fieldNames
и values
.
Точные данные, которые я получаю из FireStore:
Я отображаю их в 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 с:
Как я хочу, чтобы это работало:
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
На первый взгляд, проблема в том, что
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++) {
}
}
Listview's Adapter
RecycleView's adapter
внутриListview's Adapter
RecycleView's adapter
?