2017-02-28 93 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()。

此外,尝试并重构您的侦听器,如果可能的话删除最终的语句。

这将是我的猜测,没有看到代码运行。

相关问题