2017-02-28 5 views
0

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); 
     } 
    }; 
+0

versuchen Sie mit ViewHolder.getAdapterPosition() anstelle der Position, und setzen Sie den FirebaseAdapter in onResume – Linxy

+0

Das hat funktioniert! Danke @Linxy –

Antwort

0

Ich denke, die Frage ist hier: -

keyName = mFirebaseAdapter.getRef (Position) .getKey();

Wenn Ihre Methode Werte akzeptiert, die als "final" markiert sind, wenn sich die zugrunde liegende Auflistung ändert, z. B. die Position, wird eine Ausnahme ausgelöst.

Überprüfen Sie eventuell die Größe() oder Anzahl() des mFirebaseAdapter, bevor Sie fortfahren.

Versuchen Sie außerdem, Ihren Listener zu refaktorieren, um die endgültigen Anweisungen nach Möglichkeit zu entfernen.

Das wäre meine Vermutung, ohne den laufenden Code zu sehen.

Verwandte Themen