android dependencies android-recyclerview android-studio-2.0

android - RecyclerView.onBindViewHolder se llama solo una vez



dependencies android-recyclerview (4)

El problema no está en su código. Asegúrese de configurar layout_height en wrap_content del elemento hijo RecyclerView.

Después de muchas horas de investigación finalmente estoy consultando la ayuda oficial.

Tengo un RecyclerView.Adapter y RecyclerView.ViewHolders que funcionó perfectamente. Pero por algunas razones que no entiendo, RecyclerView.Adapter.onBindViewHolder no se llama correctamente.

private class AttendeeAdapter extends RecyclerView.Adapter<AttendeeHolder> { /*FIELDS*/ private List<Attendee> mAttendeeList; /*CONSTRUCTORS*/ public AttendeeAdapter(List<Attendee> attendees) { mAttendeeList = attendees; //Log.i(TAG, "AttendeeAdapter size: " + getItemCount()); }

En función del mensaje de registro (el recuento de elementos como el tamaño de la lista como se esperaba), asumo que el AttendeeAdapter se instaló correctamente.

Así que espero que el método onBindViewHolder (VH, int) se llame tantas veces como el tamaño de la Lista, pero no lo es. El método se llama sólo una vez!

/*METHODS*/ @Override public AttendeeHolder onCreateViewHolder(ViewGroup parent, int viewType) { LayoutInflater layoutInflater = LayoutInflater.from(getActivity()); View itemView = layoutInflater.inflate(R.layout.list_attendee, parent, false); return new AttendeeHolder(itemView); } @Override public void onBindViewHolder(AttendeeHolder holder, int position) { Attendee attendee = mAttendeeList.get(position); holder.bindAttendee(attendee, position); Log.i(TAG, "Binding ViewHolder #" + position); /* Binding ViewHolder #0 and that''s it */ } @Override public int getItemCount() { return mAttendeeList.size(); } }

My AttendeeHolder (extendiendo RecyclerView.ViewHolder) es el siguiente:

private class AttendeeHolder extends RecyclerView.ViewHolder { /*FIELDS*/ private EditText mAttendeeNameEditText; private Attendee mAttendee; /*CONSTRUCTOR*/ public AttendeeHolder(View itemView) { super(itemView); mAttendeeNameEditText = (EditText) itemView.findViewById(R.id.edit_text_list_item); mAmountEditTextList = new ArrayList<>(eventMaxCount); } /*METHODS*/ public void bindAttendee(Attendee attendee, final int position) { mAttendee = attendee; String attendeeName = mAttendee.getName(); // Set the name to the EditText if a name has already been set if (attendeeName != null) { mAttendeeNameEditText.setText(attendeeName); } } }

e implementado en el código principal como

List<Attendee> attendees = AttendeeLab.get().getAttendeeList(); mAttendeeAdapter = new AttendeeAdapter(attendees); mAmountRecyclerView.setAdapter(mAttendeeAdapter);

Supongo que el código funcionaría (creo que no he hecho ningún cambio) pero las dependencias de Gradle podrían no estar correctamente configuradas. Ahí fue donde intenté modificar recyclerview-v7: 23.3.0 para recyclerview-v7: 23.1.0 o lo que sea (ninguno de ellos funcionó).

dependencies { compile fileTree(dir: ''libs'', include: [''*.jar'']) testCompile ''junit:junit:4.12'' compile ''com.android.support:appcompat-v7:23.3.0'' compile ''com.android.support:design:23.3.0'' compile ''com.android.support:support-v4:23.3.0'' compile ''com.android.support:recyclerview-v7:23.1.2'' }

Cualquier ayuda o comentario sería apreciado. Desearía estar diciendo adiós al dolor de cabeza después de varias horas a partir de ahora.


Para las personas que tienen este problema más recientemente y que están ejecutando las versiones beta del SDK 28 de la biblioteca de soporte, cambie su SDK de destino a 27 y use la versión 27.1.1 de las bibliotecas de soporte (las versiones más recientes en el momento de la escritura).

Estaba luchando con este problema en las bibliotecas 28.0.0-alpha3, cambié la versión a 27.1.1 en mi app.gradle y el problema se resolvió.

implementation ''com.android.support:appcompat-v7:27.1.1'' implementation ''com.android.support:design:27.1.1'' implementation ''com.android.support:support-vector-drawable:27.1.1'' implementation ''com.android.support:recyclerview-v7:27.1.1''


Tenga cuidado del comportamiento onBindViewHolder en los ciclos RecyclerView. RecyclerView.ViewHolder position 0 itemView

android:layout_height="match_parent"

ocupa la pantalla actual mostrada. Scroll y onBindViewHolder deben activarse, pero asegúrese de que getItemCount se haya configurado correctamente.

Solución:

android:layout_height="wrap_content"

Solución con ConstraintLayout como elemento infladoVer:

<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content"><!-- IMPORTANT --> <!-- ... --> </android.support.constraint.ConstraintLayout>


Use las mismas versiones para todas sus bibliotecas de soporte:

dependencies { compile fileTree(dir: ''libs'', include: [''*.jar'']) testCompile ''junit:junit:4.12'' compile ''com.android.support:appcompat-v7:23.3.0'' compile ''com.android.support:design:23.3.0'' compile ''com.android.support:support-v4:23.3.0'' compile ''com.android.support:recyclerview-v7:23.3.0'' //<<< here }

Además, el RecyclerView debe agregarse con el paquete ''com.android.support:design:23.3.0'' ; la sobrescritura de la clase o de la magia que Gradle haya hecho en el proceso de compilación con este paquete "duplicado" puede haber causado su problema.