2017-02-28 51 views
0

我試圖在用戶單擊一個項目時獲取Firebase記錄的鍵名。它工作正常,但當用戶刪除一條記錄,然後點擊該記錄被刪除/下的另一條記錄時,我得到一個IndexOutOfBoundsException。獲取FirebaseRecyclerAdapter中的鍵名拋出IndexOutOfBoundsException

我不太明白爲什麼會出現這個問題。有人可以向我解釋爲什麼會發生這種情況,我應該怎麼做才能解決問題?這是我正在使用的代碼。試圖在視圖onClickListener內調用mFirebaseAdapter.getRef(position).getKey()時發生錯誤。

@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

嘗試使用viewHolder.getAdapterPosition()而不是位置,並將firebaseAdapter放入onResume – Linxy

+0

工作正常!謝謝@Linxy –

回答

0

我認爲這個問題是在這裏: -

的keyName = mFirebaseAdapter.getRef(位置).getKey();

由於如果底層集合發生更改(如位置),您的方法會接受標記爲「最終」的值,則會引發異常。

也許在繼續之前檢查mFirebaseAdapter的大小()或count()。

此外,嘗試並重構您的偵聽器,如果可能的話刪除最終的語句。

這將是我的猜測,沒有看到代碼運行。

相關問題