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)); } } 
  • Error al agregar dependencias para firebase-ui-auth
  • Símbolo de autenticación no válido después de 1 hora - persistencia de disco en Firebase
  • FirebaseUI auth se está estrellando en android
  • Cómo obtener la clave obj de FirebaseListAdapter en el elemento Haga clic en. FirebaseUI
  • Cómo utilizar el adaptador de lista de Firebase
  • OAuth2 problemas después de actualizar firebase
  • FirebaseUI Auth - Error de inicio de sesión de Facebook: respuesta de debug_token fallida de Facebook
  • ¿Cómo agregar más elementos a FirebaseRecyclerAdapter?
  • Error: Error al resolver: com.twitter.sdk.android:twitter:2.3.0 - Android Studio
  • Fusión de manifiesto de Android con las bibliotecas de facebook y firebase
  • Cómo hacer la vista de mensaje roscado con enviar y recibir mensajes en dos lados con la vista de reciclador
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.