Mostrando itens em ListViews dentro de um RecyclerView

Matthew Anthony:

Eu tenho um List<CopyModel> copyDatacom 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 fieldNamese values.
Os dados exatos que recebo de FireStore :

digite descrição da imagem aqui

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 fieldNamesevalues

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

Texas Pandya:

À primeira vista eu acho que é problema

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

Aqui você estiver usando o positionque é 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) onBindViewHolderdo 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++) {
  }
}

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=214549&siteId=1
Recomendado
Clasificación