Ich versuche, den Schlüsselname für einen Firebase-Datensatz zu erhalten, wenn der Benutzer auf ein Element klickt. Und es funktioniert gut, aber wenn der Benutzer einen Datensatz löscht und danach auf einen anderen Datensatz klickt, der sich unterhalb/nach dem Datensatz befindet, der gelöscht wurde, erhalte ich eine IndexOutOfBoundsException.Abrufen von Schlüsselname in FirebaseRecyclerAdapter löst IndexOutOfBoundsException
Ich verstehe nicht ganz, warum dieses Problem passiert. Kann mir jemand erklären, warum das passiert, und was soll ich tun, um es zu beheben? Hier ist der Code, den ich verwende. Beim Versuch, mFirebaseAdapter.getRef(position).getKey()
in der Ansicht onClickListener aufzurufen, tritt ein Fehler auf.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
mFirebaseAdapter = new FirebaseRecyclerAdapter<Produto, MessageViewHolder>(
Produto.class,
R.layout.item_message,
MessageViewHolder.class,
mFirebaseDatabaseReference.child(PRODUTOS).orderByChild("descricao")) {
@Override
protected void populateViewHolder(final MessageViewHolder viewHolder,
final Produto produto, final int position) {
TextView messageView = viewHolder.viewDescricao;
String descricaoTemp = produto.getDescricao();
if (descricaoTemp != null && descricaoTemp.length() > 25)
descricaoTemp = descricaoTemp.substring(0, 25);
messageView.setText(descricaoTemp);
if (produto.getReservado())
messageView.setPaintFlags(messageView.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
viewHolder.viewValor.setText(produto.getValor());
File file = getFileFromImageName(produto.getBase64());
if (file.exists())
viewHolder.viewImagem.setImageURI(Uri.fromFile(file));
View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick(View view) {
keyName = mFirebaseAdapter.getRef(position).getKey();
Intent intent = new Intent(MainActivity.this, CadastrarNovoProduto.class);
intent.putExtra("key", keyName);
intent.putExtra("Descricao", produto.getDescricao());
intent.putExtra("Valor", produto.getValor());
intent.putExtra("base64", produto.getBase64());
intent.putExtra("urlImagem", produto.getUrlImagem());
intent.putExtra("currentUserEmail", mFirebaseUser.getEmail());
intent.putExtra("Reservado", produto.getReservado());
startActivityForResult(intent, RC_EDITAR_PRODUTO);
}
};
viewHolder.viewDescricao.setOnClickListener(listener);
viewHolder.viewValor.setOnClickListener(listener);
viewHolder.viewImagem.setOnClickListener(listener);
}
};
versuchen Sie mit ViewHolder.getAdapterPosition() anstelle der Position, und setzen Sie den FirebaseAdapter in onResume – Linxy
Das hat funktioniert! Danke @Linxy –