Acoplamiento de FirebaseRecyclerViewAdapter a un Boolean / String Map.Entry

Estoy utilizando el FirebaseRecyclerViewAdapter de la com.firebaseui:firebase-ui:0.2.0 en muchas ubicaciones de mi aplicación. Mi pregunta es cómo aplicarlo en situaciones en las que el argumento query devuelve un número de valores de entrada 'index' (Map.Entry).

Como se indica en la documentación de Firebase ( https://www.firebase.com/docs/android/guide/structuring-data.html ), estoy utilizando índices para mantener la estructura de datos plana. Esto lleva a una situación en la que necesito vincular estos índices a mi ViewHolder. Dentro del método de vista de población, estoy utilizando la clave del índice para recuperar los datos para llenar el visor con.

Tengo problemas para crear el adaptador, no estoy seguro de cómo definir el argumento 'modelClass' en caso de un Boolean / String Map.Entry:

 mAdapter = new FirebaseRecyclerViewAdapter<Map.Entry<String, Boolean>, ItemViewHolder>(???.class, R.layout.my_card, ItemViewHolder.class, getItemIndexQuery(mKey) ) { ... } 

3 Solutions collect form web for “Acoplamiento de FirebaseRecyclerViewAdapter a un Boolean / String Map.Entry”

Su valor es un Boolean , no un Map . Así que su comentario es correcto: necesitará especificar Boolean / Boolean.class para el tipo de valor. Para poder buscar la clave, necesitará actualizar a FirebaseUI-Android 0.2.2. En ese lanzamiento añadimos una sobrecarga populateViewHolder(VH, T, int) que obtiene la posición del elemento como un parámetro. Con eso, usted puede buscar la llave del artículo.

Digamos que esta es su estructura JSON:

 { "items": { "pushid1": "Fri Jan 01 2016 16:40:54 GMT-0800 (PST)", "pushid2": "Fri Jan 01 2016 16:41:07 GMT-0800 (PST)", "pushid3": "Fri Jan 01 2016 16:41:25 GMT-0800 (PST)", "pushid4": "Fri Jan 01 2016 16:41:37 GMT-0800 (PST)", "pushid5": "Fri Jan 01 2016 16:42:04 GMT-0800 (PST)" }, "index": { "pushid1": true, "pushid3": true, "pushid5": true } } 

Así que almacenamos las cadenas que representan la fecha / hora y tenemos un índice para seleccionar un subconjunto de estos elementos.

Ahora podemos cargar los nodos del índice, luego cargar los elementos a los que se refieren esos nodos y mostrarlos en las vistas con:

 FirebaseRecyclerViewAdapter<Boolean, ItemViewHolder> adapter = new FirebaseRecyclerViewAdapter<Boolean, ItemViewHolder>( Boolean.class, android.R.layout.two_line_list_item, ItemViewHolder.class, ref.child("index")){ protected void populateViewHolder(final ItemViewHolder viewHolder, Boolean model, int position) { String key = this.getRef(position).getKey(); ref.child("items").child(key).addListenerForSingleValueEvent(new ValueEventListener() { public void onDataChange(DataSnapshot dataSnapshot) { String date = dataSnapshot.getValue(String.class); ((TextView)viewHolder.itemView.findViewById(android.R.id.text1)).setText(date); } public void onCancelled(FirebaseError firebaseError) { } }); } }; 

La salida en la pantalla:

Aplicación para Android que muestra tres fechas

Para obtener el código completo, consulte Activity34559171 en este repo .

Me enfrenté al mismo problema y finalmente encontré esta clase: FirebaseIndexRecyclerAdapter Que funciona perfectamente para mí.

Editar 4

Dejé en el código de abajo, fue basura. 🙁 Por favor, no lo use.Reescribí la parte de la base de datos de Firebase-UI , así que por favor use eso en su lugar.

Ediciones 1, 2 y 3

Puesto que addListenerForSingleValueEvent significa que los datos serán estáticos (a menos que usted cambie el valor en la llave), aquí está mi manera de prevenir datos estáticos sin cambiar el valor de la llave:

Cree una lista de oyentes de evento y objetos de soporte:

 private Map<DatabaseReference, ValueEventListener> mValueEventListeners = new ArrayMap<>(); private List<TeamInfo> mTeamInfoList = new ArrayList<>(); 

El FirebaseRecyclerAdapter :

 RecyclerView recyclerView = (RecyclerView) findViewById(R.id.content_main_recycler_view); recyclerView.setHasFixedSize(true); recyclerView.setLayoutManager(new LinearLayoutManager(this)); mRecyclerViewAdapter = new FirebaseRecyclerAdapter<Long, TeamHolder>( Long.class, R.layout.activity_main_row_layout, TeamHolder.class, Utils.getDatabase() .getReference() .child(Constants.FIREBASE_TEAM_INDEXES) .child(mUser.getUid()) .orderByValue()) { @Override public void populateViewHolder(final TeamHolder teamHolder, Long teamNumberDoNotUse, final int position) { DatabaseReference databaseReference = Utils.getDatabase() .getReference() .child(Constants.FIREBASE_TEAMS) .child(getRef(position).getKey()); if (!mValueEventListeners.containsKey(databaseReference)) { ValueEventListener valueEventListener = new ValueEventListener() { public void onDataChange(DataSnapshot dataSnapshot) { if (dataSnapshot.getValue() != null) { TeamInfo teamInfo = dataSnapshot.getValue(TeamInfo.class); if (position >= mTeamInfoList.size()) { String teamNumber = teamInfo.getNumber(); teamHolder.setTeamNumber(teamNumber); teamHolder.setTeamName(teamInfo.getName(), MainActivity.this.getString(R.string.no_name)); teamHolder.setTeamLogo(teamInfo.getMedia(), MainActivity.this); teamHolder.setListItemClickListener(teamNumber, MainActivity.this, dataSnapshot.getKey()); teamHolder.setCreateNewScoutListener(teamNumber, MainActivity.this, dataSnapshot.getKey()); mTeamInfoList.add(teamInfo); } else { mTeamInfoList.set(position, teamInfo); notifyItemChanged(position); } } else { // This should never happen since we are caching this offline FirebaseCrash.report(new IllegalStateException( "MainActivity RecyclerView event listener had null value (ref: " + dataSnapshot.getRef() + "pointed to non existent data)")); } } public void onCancelled(DatabaseError databaseError) { FirebaseCrash.report(databaseError.toException()); } }; databaseReference.addValueEventListener(valueEventListener); mValueEventListeners.put(databaseReference, valueEventListener); } else { String teamNumber = mTeamInfoList.get(position).getNumber(); teamHolder.setTeamNumber(teamNumber); teamHolder.setTeamName(mTeamInfoList.get(position).getName(), MainActivity.this.getString(R.string.no_name)); teamHolder.setTeamLogo(mTeamInfoList.get(position).getMedia(), MainActivity.this); teamHolder.setListItemClickListener(teamNumber, MainActivity.this, getRef(position).getKey()); teamHolder.setCreateNewScoutListener(teamNumber, MainActivity.this, getRef(position).getKey()); } } }; recyclerView.setAdapter(mRecyclerViewAdapter); 

En su OnDestroy :

 @Override protected void onDestroy() { super.onDestroy(); if (mRecyclerViewAdapter != null) { mRecyclerViewAdapter.cleanup(); } for (DatabaseReference databaseReference : mValueEventListeners.keySet()) { databaseReference.removeEventListener(mValueEventListeners.get(databaseReference)); } } 
  • FirebaseUI autenticación con Facebook no funciona
  • Android Firebase chat RecyclerView desplazamiento automático hacia abajo cuando se agrega un nuevo elemento
  • ¿Sólo rellenar viewHolder con mensajes recuperados de la base de datos?
  • Biblioteca de FirebaseUI Auth: falla en el inicio de sesión de Google con: W / AuthMethodPicker: inicio de sesión de Firebase sin éxito
  • Cómo excluir el elemento de un FirebaseRecyclerAdapter
  • Leer datos de Firebase tarda mucho incluso con un pequeño conjunto de datos
  • Cómo utilizar el adaptador de lista de Firebase
  • Firebase RecyclerView - Desplácese sobre la animación cuando se añade un elemento nuevo
  • No se puede convertir el objeto de tipo java.util.ArrayList al modelo de tipo
  • OAuth2 problemas después de actualizar firebase
  • Error: Error al resolver: com.twitter.sdk.android:twitter:2.3.0 - Android Studio
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.