在FirebaseRecyclerAdapter中获取keyname会抛出IndexOutOfBoundsException

时间:2017-02-28 20:27:15

标签: android firebase firebase-realtime-database firebaseui

我尝试在用户点击一个项目时获取Firebase记录的密钥名称。并且它工作正常,但是当用户删除记录时,然后点击该记录之下/之后的另一条记录被删除,我得到一个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);
        }
    };

1 个答案:

答案 0 :(得分:0)

我认为问题在于: -

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

如果基础集合发生更改(例如位置),您的方法接受标记为“final”的值,那么它将抛出异常。

在继续之前,可以检查mFirebaseAdapter的size()或count()。

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

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