Eu tenho um List<CopyModel> copyData
com todos os meus dados, eu quero mostrar.
A classe CopyModel parece com isso:
public class CopyModel {
public String autoId;
public List<String> fieldNames;
public List<Object> values;
}
Eu quero mostrar itens de fieldNames
e values
.
Os dados exatos que recebo de FireStore :
Eu estou exibi-los em um ListView , com simple_list_item_2
.
Aqui está o código:
@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);
}
Comportamento atual : O recyclerView está mostrando 3 ListViews com:
- copyData0.fieldNames0 => "default"
- copyData0.values0 => "false"
- copyData1.fieldNames1 => "Pont"
- copyData1.fieldNames1 => "9"
- copyData1.fieldNames1 => "entity_name"
- copyData1.fieldNames1 => "pontos de Análise"
Como eu quero que ele funcione :
O RecyclerView iria mostrar como muitas listas como o tamanho da copyData
(neste caso, 3), e cada um ListView teria tantas linhas quanto o tamanho de sua fieldNames
(agora é 5, mas pode ser qualquer outra)
EDITAR:
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);
Agora eu estou recebendo os 3 objetos separados, em 3 listview independente, mas apenas os primeiros 3 valores de fieldNames
evalues
EDIT # 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);
}
}
Dessa forma eu posso adicionar cada par nome do campo de valor à lista, mas ele se comporta como, ele vai ao longo destes 2 linhas
final List<String> names = copyData.get(i).fieldNames; final List<Object> values = copyData.get(i).values;
3 vezes, em seguida, exibe todos os pares de nome do campo de valor do último objeto em 3 ListViews separadas
À primeira vista eu acho que é problema
String tS1 = copyData.get(position).fieldNames.get(position);
Aqui você estiver usando o position
que é a posição Adaptadores de Listview. assim que sua declaração deve
String tS1 = copyData.get(Recycleview Adapter Position).fieldNames.get(Listview adapter position);
Desde a sua edição:
Agora eu estou recebendo os 3 objetos separados, em 3 listview independente, mas apenas os primeiros 3 valores
Razão:
Seu primeiro adaptador (adaptador Recyleview) está em execução apenas três vezes.
Se eu entendi sua pergunta. você precisa fazer algo como isto:
1) definir o seu Recycleview com lista de copyData
(o que você está fazendo corretamente).
2) onBindViewHolder
do seu recycleview. gerar uma lista completa de fieldNames e valores e definir o seu adaptador Listview
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
YourCustomeListViewAdapter adapter = new YourCustomeListViewAdapter(younewlistwithfieldNamesandvalue)
holder.copyList.setAdapter(adapter);
}
EDIT 2
Está loop através CopyData. que é errado.
for (int i = 0;i<copyData.size();i++)
você precisa percorrer nome do campo e os valores array.like este
@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++) {
}
}