android-developers
[Arriba] [Todas las Listas]

[android-developers] Por qué hace RecyclerView.Espectáculo de adaptado

To: Android Developers <android-developers@xxxxxxxxxxxxxxxx>
Subject: [android-developers] Por qué hace RecyclerView.Espectáculo de adaptador sólo el último elemento de lista?
From: Jeff Biss <jeff@xxxxxxxxxxxxx>
Date: Tue, 1 Aug 2017 11:15:38 -0700 (PDT)
Delivery-date: Tue, 01 Aug 2017 14:16:59 -0400
Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlegroups.com; s=20161025; h=sender:date:from:to:message-id:subject:mime-version :x-original-sender:reply-to:precedence:mailing-list:list-id :list-post:list-help:list-archive:list-subscribe:list-unsubscribe; bh=hcTveuuxO6cv27+hukSurECFbrYf7RGCsOjupjBE03Q=; b=X2NVi5dPBsEHPOCqNin71OsA6rDqiRumqtCtN5qjroFiepNNP3xSeqQ7M8e0VgJF2M G+Eqv/LY8/JSpmQyLy++Y/Bd+YLlSCfo7ifUMOVg9uYc1XmpDAVaVIpr00Mq6ykfbsw2 VhWEvHrn+JVmK0XMZe1QihMZqTplc0dJ9CLGLysWuUZ/Wap1tdiYV0H9wCVe/OVRLddg lm+AYjJgO73K+HQJH+h9mCqMKsJQddgjrp1qjszE4Bj8xjfY3lIQ/f5f92jIu0GsYta2 gPAWfbDtkD9mtN0WmtuYLqSpoGsSlXDU3qKsUl19fajqWF5L6Kjnk1xGeNCkPyBanDcR sG5g==
Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marco-inc-com.20150623.gappssmtp.com; s=20150623; h=date:from:to:message-id:subject:mime-version:x-original-sender :reply-to:precedence:mailing-list:list-id:list-post:list-help :list-archive:list-subscribe:list-unsubscribe; bh=hcTveuuxO6cv27+hukSurECFbrYf7RGCsOjupjBE03Q=; b=d0gmen2tRfX6IU6ui+URGvz2fWgXJCDxxm4tKD672SnefSbqRFtoe4Vm2Z51+rzB+6 KIfOBVRr1hQ6ZmaVxjsv9RUbhlQmgumKPwxYUo2WLv+Q32nkKj9E2esaJmb1IPoqC/nj kzSWrqVk2VPmj6rQjJHAPvFI4fHEeUUbGXa+wcZ7cBx47Xb2WMBw++kS0fImZBzvl366 JfLfGjl5vqSl5aDwkHFVcHzwCsWJvNtQlqRQ5po35/vi8zqteDNz5iiwmgRRGGY/U6Bd marbhwAgJo4cWPZdHZl3O3Zp5XAbDXSkuv9CrBZN8UCDXab53WO9GXzES00uymhqaS3o NcIQ==
Envelope-to: traductor@xxxxxxxxxxx
List-archive: <https://groups.google.com/group/android-developer>
List-help: <https://groups.google.com/support/>, <mailto:android-developers+help@googlegroups.com>
List-id: <android-developers.googlegroups.com>
List-post: <https://groups.google.com/group/android-developers/post>, <mailto:android-developers@googlegroups.com>
List-subscribe: <https://groups.google.com/group/android-developers/subscribe>, <mailto:android-developers+subscribe@googlegroups.com>
List-unsubscribe: <mailto:googlegroups-manage+364598216046+unsubscribe@googlegroups.com>, <https://groups.google.com/group/android-developers/subscribe>
Mailing-list: list android-developers@xxxxxxxxxxxxxxxx; contact android-developers+owners@xxxxxxxxxxxxxxxx
Reply-to: android-developers@xxxxxxxxxxxxxxxx
Sender: android-developers@xxxxxxxxxxxxxxxx
Yo *posted esta cuestión en *stackoverflow.*com Pero empezado para sentir que esto 
puede ser demasiado técnico que la mayoría de usuarios en aquel sitio pueden manejar, cuando parece 
a mí que algo no es bastante bien con la manera el adaptador está 
manejando el *ArrayList pasado a él.

Estoy intentando aprender cómo para utilizar el *RecyclerView y ha encontrado que sólo 
el último elemento en un *ArrayList es mostrado en ambas posiciones (hay 
sólo dos) y no puede imaginar fuera de por qué. He utilizado *LogCat para mostrar lo que está 
yendo en tan mirada al *LogCat producción abajo.


   - Líneas 2 y 3 espectáculo que el *cursor ha accedido el DB.
   - Líneas 4 *thru 8 espectáculo que los nombres son recuperados del DB y pasado 
   a *ArrayLists.
   - El nombre "variable" almacena el elemento del *cursor y entonces es 
   utilizado para poblar el *ArrayLists: *pN es un *ArrayList y es utilizado para mostrar el 
   nombre real (líneas 5 y 7) y *petNameList es un *ArrayList y muestra lo que 
   supongo es un *pointer al objeto de nombre (líneas 8, 10, 16 y 22).
   - Cuando mostrado en línea 9, el Adaptador es introducido con éxito y cuando mostrado 
   en línea 10 el *petNameList *ArrayList es pasado al *adater elementos 
   *ArrayList (tienen las mismas referencias al *PetName objetos). Nota 
   que línea 11 espectáculos el número de elementos de adaptador que está manejando encima.
   
Ahora el problema:

Cuando puede ser visto en líneas 17 y 23, hay dos posiciones en el *ArrayList 
todavía sólo el segundo (el último elemento en el *ArrayList) nombre "*qwerty" es 
pasado al *ViewHolder (cuando mostrado en líneas 18 y 24 ) y así mostrado 
en el *Android Estudio *emulator pantalla. No puedo entender que si el 
*ArrayList las posiciones son correctas y las referencias son diferentes (un siendo 
al "*fert" objeto de nombre y el otro al "*qwerty" objeto de nombre), por qué 
único "*qwerty" sería exhibición? Cualquier ayuda es apreciada.

Parece que el adaptador está ignorando el nombre en posición 0.

Para claridad y espacial, copié sólo lo que pienso es el pertinente 
*MainActivity código abajo el *LogCat producción y el código de Adaptador abajo aquello. 
Cada cual muestra el *Log.*d() Declaraciones que tendrían que ayudar con correlación.

**LogCat*:

1. !------*MainActivity: Inicios aquí-----!
2. el DB tiene: 2 filas
3. *cursor Tiene: 2 filas
4. Nombre de *cursor es: *fert
5. *pN *arraylist[0] es: *fert
6. Nombre de *cursor es: *qwerty
7. *pN *arraylist[1] es: *qwerty
8. *petNameList Es: [com.example.jbiss.petminder.petname@f411810, 
*com.Ejemplo.*jbiss.*petminder.*PetName@6*c4*f09]
9. Hecho lo a: *SelectNameAdapter constructor
10. Los Elementos es: [com.example.jbiss.petminder.petname@f411810, 
*com.Ejemplo.*jbiss.*petminder.*PetName@6*c4*f09]
11. *mAdapter Cuenta es: 2
12. *OpenGLRenderer: Uso *EGL_SWAP_*BEHAVIOR_PRESERVÓ: cierto
13. Hecho lo a: *onCreateViewHolder
14. Hecho lo a: *ViewHolder
15. Hecho lo a: *onBindViewHolder
16. *mItems Es: [com.example.jbiss.petminder.petname@f411810, 
*com.Ejemplo.*jbiss.*petminder.*PetName@6*c4*f09]
17. Posición en *ArrayList es: 0
18. *onBindViewHolder[0]: pasado *qwerty a *ViewHolder
19. Hecho lo a: *onCreateViewHolder
20. Hecho lo a: *ViewHolder
21. Hecho lo a: *onBindViewHolder
22. *mItems Es: [com.example.jbiss.petminder.petname@f411810, 
*com.Ejemplo.*jbiss.*petminder.*PetName@6*c4*f09]
23. Posición en *ArrayList es: 1
24. *onBindViewHolder[1]: pasado *qwerty a *ViewHolder

*El código pertinente en *MainActivity:*

    *Log.*d("!------*MainActivity", "Empieza aquí-----!");

    //Poblar la lista con los nombres regresados del DB de nombre de la mascota
    mucho tiempo *numItems = *mDbHelper.*getPetCount();
    *Log.*d("el DB tiene", Cadena.*valueOf(*numItems) + " Filas");
    si (*numItems != 0)
        #unknown{^*cursor = *mDbHelper.*getPetNames();
        *numItems = *cursor.*getCount();
        *Log.*d("*cursor Tiene", Cadena.*valueOf(*numItems) + " Filas");
        *cursor.*moveToFirst();
        Puesto que (*int *i = 0; *i < *numItems; *i++)
            #unknown{^*PetName el nombre = nuevo *PetName(*cursor.*getString(NOMBRES_de MASCOTA));
            *Log.*d("Nombre de *cursor es", nombre.*getPetName());
            *petNameList.Añade(nombre);
            PN = *cursor.*getString(NOMBRES_de MASCOTA);
            *pN.Añade(PN);
            *Log.*d("*pN *arraylist" + "[" + *i + "] Es", Cadena.*valueOf(PN));
            *cursor.*moveToNext();
        }
    } Más
        //#unknown{^*otherwise, si #ninguno nombres de mascota existen *int él DB, hace las #ninguno mascotas 
el mensaje 
    encontrado visible
        *msgTv.*setText(*R.Cadena.Ninguna_mascota);
        *msgTv.*setVisibility(Vista.VISIBLE);
    }

    //el siguiendo producciones *URIs para los nombres que significan que el *arraylist
    //es un conjunto de *pointers al *PetName objetos?
    *Log.*d("*petNameList Es", Cadena.*valueOf(*petNameList));
    *mAdapter = Nuevo *SelectNameAdapter(esto, *petNameList);
    *mRecyclerView.*setAdapter(*mAdapter);
    *Log.*d("*mAdapter Cuenta es", Cadena.*valueOf(*mAdapter.*getItemCount()));

*Código de adaptador:*

clase pública *SelectNameAdapter extiende 
*RecyclerView.Adaptador<*SelectNameAdapter.*ViewHolder

#Adj *ArrayList<*PetName> *mItems;
Contexto privado *mContext;

público *SelectNameAdapter(contexto de Contexto, *ArrayList<*PetName> elementos)
    #unknown{^*Log.*d("Hecho lo a ," "*SelectNameAdapter constructor");
    //el siguiendo producciones *URIs para los nombres que significan que el *arraylist
    //es un conjunto de *pointers al *PetName objetos?
    *Log.*d("Los Elementos es", Cadena.*valueOf(Elementos));
    esto.*mContext = Contexto;
    esto.*mItems = Elementos;
}

@*Override
público *SelectNameAdapter.*ViewHolder *onCreateViewHolder(*ViewGroup Padre, 
*int *i)
    #unknown{^*Log.*d("Hecho lo a ," "*onCreateViewHolder");
    *LayoutInflater *inflater = *LayoutInflater.De(*mContext);
    Vista *itemView = *inflater.*inflate(*R.*layout.Mascota_*info, padre, falso);
    *ViewHolder *viewHolder = nuevo *ViewHolder(*itemView);
    regreso *viewHolder;
}

@*Override
público *void *onBindViewHolder(*SelectNameAdapter.*ViewHolder Titular, *int 
posición)
    #unknown{^*Log.*d("Hecho lo a ," "*onBindViewHolder");
    *PetName elemento = *mItems.Consigue(posición);
    *Log.*d("*mItems Es", Cadena.*valueOf(*mItems));
    *Log.*d("Posición en *ArrayList es", Cadena.*valueOf(Posición));
    titular.*tvName.*setText(Elemento.*getPetName());
    *Log.*d("*onBindViewHolder[" + Posición + "]", "elemento " pasado.*getPetName() + " A *ViewHolder");
}

@*Override
público *int *getItemCount() {

        #nom *mItems.Medida();

    }


    público *static clase *ViewHolder extiende *RecyclerView.*ViewHolder


        #Nom *TextView *tvName;

        público *ViewHolder(Vista *itemView)

            #unknown{^*super(*itemView);

            *Log.*d("Hecho lo a ," "*ViewHolder");

            *tvName = (*TextView) *itemView.*findViewById(*R.*id.*petname);

        }

    }

}

-- 
Recibiste este mensaje porque eres *subscribed al *Google Grupos "*Android *Developers" grupo.
A *unsubscribe de este grupo y la parón que recibe *emails de él, enviar un *email a *android-*developers+unsubscribe@xxxxxxxxxxxxxxxx.
A correo a este grupo, envía *email a *android-developers@xxxxxxxxxxxxxxxx.
Visita este grupo en *https://grupos.*google.*com/Grupo/*android-*developers.
Para ver esta discusión en la visita de web *https://grupos.*google.*com/*d/*msgid/*android-*developers/*b82180#uno3-321un-49*c7-*bace-*def81*d9*f5*f51%40*googlegroups.*com.
Para más opciones, visita *https://grupos.*google.*com/*d/*optout.
I posted this question on stackoverflow.com but started to feel that this 
may be too technical than most users on that site can handle, as it seems 
to me that something is not quite right with the way the adapter is 
handling the ArrayList passed to it.

I am trying to learn how to use the RecyclerView and have found that only 
the last item in an ArrayList are displayed in both positions (there are 
only two) and can't figure out why. I have used LogCat to show what is 
going on so look to the LogCat output below.


   - Lines 2 and 3 show that the cursor has accessed the DB.
   - Lines 4 thru 8 show that the names are retrieved from the DB and 
   passed to ArrayLists.
   - The variable "name" stores the element from the cursor and then is 
   used to populate the ArrayLists: pN is an ArrayList and is used to show the 
   actual name (lines 5 and 7) and petNameList is an ArrayList and shows what 
   I assume is a pointer to the name object (lines 8, 10, 16 and 22).
   - As shown in line 9, the Adapter is entered successfully and as shown 
   in line 10 the petNameList ArrayList is past to the adater's items 
   ArrayList (they have the same references to the PetName objects). Note that 
   line 11 shows the number of adapter items that it is operating on.
   
Now the problem:

As can be seen in lines 17 and 23, there are two positions in the ArrayList 
yet only the second (the last item in the ArrayList) name "qwerty" is 
passed to the ViewHolder (as shown in lines 18 and 24 ) and thus displayed 
on the Android Studio emulator's screen. I can't understand that if the 
ArrayList positions are correct and the references are different (one being 
to the "fert" name object and the other to the "qwerty" name object), why 
only "qwerty" would be display? Any help is appreciated.

It seems that the adapter is ignoring the name at position 0.

For clarity and space, I copied only what I think is the relevant 
MainActivity code below the LogCat output and the Adapter code below that. 
Each shows the Log.d() statements that should help with correlation.

*LogCat*:

1. !------MainActivity: Starts here-----!
2. DB has: 2 rows
3. cursor has: 2 rows
4. name from cursor is: fert
5. pN arraylist[0] is: fert
6. name from cursor is: qwerty
7. pN arraylist[1] is: qwerty
8. petNameList is: [com.example.jbiss.petminder.PetName@f411810, 
com.example.jbiss.petminder.PetName@6c4f09]
9. made it to: SelectNameAdapter constructor
10. items is: [com.example.jbiss.petminder.PetName@f411810, 
com.example.jbiss.petminder.PetName@6c4f09]
11. mAdapter count is: 2
12. OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true
13. made it to: onCreateViewHolder
14. made it to: ViewHolder
15. made it to: onBindViewHolder
16. mItems is: [com.example.jbiss.petminder.PetName@f411810, 
com.example.jbiss.petminder.PetName@6c4f09]
17. position in ArrayList is: 0
18. onBindViewHolder[0]: passed qwerty to ViewHolder
19. made it to: onCreateViewHolder
20. made it to: ViewHolder
21. made it to: onBindViewHolder
22. mItems is: [com.example.jbiss.petminder.PetName@f411810, 
com.example.jbiss.petminder.PetName@6c4f09]
23. position in ArrayList is: 1
24. onBindViewHolder[1]: passed qwerty to ViewHolder

*The relevant code in MainActivity:*

    Log.d("!------MainActivity", "Starts here-----!");

    //populate the list with the names returned from the pet name DB
    long numItems = mDbHelper.getPetCount();
    Log.d("DB has", String.valueOf(numItems) + " rows");
    if (numItems != 0) {
        cursor = mDbHelper.getPetNames();
        numItems = cursor.getCount();
        Log.d("cursor has", String.valueOf(numItems) + " rows");
        cursor.moveToFirst();
        for (int i = 0; i < numItems; i++) {
            PetName name = new PetName(cursor.getString(PET_NAMES));
            Log.d("name from cursor is", name.getPetName());
            petNameList.add(name);
            PN = cursor.getString(PET_NAMES);
            pN.add(PN);
            Log.d("pN arraylist" + "[" + i + "] is", String.valueOf(PN));
            cursor.moveToNext();
        }
    } else{
        //otherwise, if no pet names exist int he DB, make the no pets 
found 
    message visible
        msgTv.setText(R.string.no_pets);
        msgTv.setVisibility(View.VISIBLE);
    }

    //the following outputs URIs for the names meaning that the arraylist
    //is a set of pointers to the PetName objects?
    Log.d("petNameList is", String.valueOf(petNameList));
    mAdapter = new SelectNameAdapter(this, petNameList);
    mRecyclerView.setAdapter(mAdapter);
    Log.d("mAdapter count is", String.valueOf(mAdapter.getItemCount()));

*Adapter code:*

public class SelectNameAdapter extends 
RecyclerView.Adapter<SelectNameAdapter.ViewHolder> {

private ArrayList<PetName> mItems;
private Context mContext;

public SelectNameAdapter(Context context, ArrayList<PetName> items) {
    Log.d("made it to", "SelectNameAdapter constructor");
    //the following outputs URIs for the names meaning that the arraylist
    //is a set of pointers to the PetName objects?
    Log.d("items is", String.valueOf(items));
    this.mContext = context;
    this.mItems = items;
}

@Override
public SelectNameAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, 
int i) {
    Log.d("made it to", "onCreateViewHolder");
    LayoutInflater inflater = LayoutInflater.from(mContext);
    View itemView = inflater.inflate(R.layout.pet_info, parent, false);
    ViewHolder viewHolder = new ViewHolder(itemView);
    return viewHolder;
}

@Override
public void onBindViewHolder(SelectNameAdapter.ViewHolder holder, int 
position) {
    Log.d("made it to", "onBindViewHolder");
    PetName item = mItems.get(position);
    Log.d("mItems is", String.valueOf(mItems));
    Log.d("position in ArrayList is", String.valueOf(position));
    holder.tvName.setText(item.getPetName());
    Log.d("onBindViewHolder[" + position + "]", "passed " + 
item.getPetName() + " to ViewHolder");
}

@Override
public int getItemCount() { {

        return mItems.size();

    }


    public static class ViewHolder extends RecyclerView.ViewHolder {


        public TextView tvName;

        public ViewHolder(View itemView) {

            super(itemView);

            Log.d("made it to", "ViewHolder");

            tvName = (TextView) itemView.findViewById(R.id.petname);

        }

    }

}

-- 
You received this message because you are subscribed to the Google Groups "Android Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email to android-developers+unsubscribe@xxxxxxxxxxxxxxxx.
To post to this group, send email to android-developers@xxxxxxxxxxxxxxxx.
Visit this group at https://groups.google.com/group/android-developers.
To view this discussion on the web visit https://groups.google.com/d/msgid/android-developers/b82180a3-321a-49c7-bace-def81d9f5f51%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
<Anterior por Tema] Tema Actual [Siguiente por Tema>
  • [android-developers] Por qué hace RecyclerView.Espectáculo de adaptador sólo el último elemento de lista?, Jeff Biss <=