繁体   English   中英

Android Studio,Firebase-列表错误

[英]Android Studio, Firebase - List error

我正在尝试从List获得帖子的作者,但出现错误:

java.lang.ArrayIndexOutOfBoundsException: length=12; index=-1

程序始终为我提供等于-1的索引,这是从中获取错误的代码:

@Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

            if(dataSnapshot.hasChild(mCurrentUser.getUid())){

                mDatabasePosts.orderByKey().equalTo(dataSnapshot.getKey()).addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        if(dataSnapshot.exists()) {

                            if(mPostModelList.size() == 1) {
                                mPostModelList.clear();
                                mAdapter.notifyDataSetChanged();
                            }else if(mPostModelList.size() > 1){
                                Post post = dataSnapshot.getValue(Post.class);

                                //mPostModelList.remove(post);

                                /* ERROR -----> */ String p = mPostModelList.get(mPostModelList.indexOf(post)).getDesc(); // <----- ERROR

                                Toast.makeText(mView.getContext(), p, Toast.LENGTH_SHORT).show();


                                mAdapter.notifyDataSetChanged();
                            }
                        }
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });

问题是您在此行中触发查询:

mDatabasePosts.orderByKey().equalTo(dataSnapshot.getKey())...

当您对Firebase数据库执行查询时,可能会有多个结果。 因此,此查询生成的快照包含这些结果的列表。 即使只有一个结果,快照也将包含一个结果的列表。 而且您的听众无法处理它得到列表的事实。

但是在这种情况下,您甚至不需要查询。 第一行等效于:

mDatabasePosts.child(dataSnapshot.getKey())...

这将直接查找子节点,而不是触发查询。 不仅可以保证仅得到一个结果,而且还可以更快(因为服务器不需要对其进行查询)。 第三个优点:传递给回调的dataSnapshot仅包含单个快照,因此您无需循环。 您当前的代码将正常工作。

如果在列表中找不到postmPostModelList.indexOf(post)将返回-1。

如果确定post对象存在于该列表中并且仍然没有获得正确的索引,则需要在Post类中重写equals()和hashCode()方法,并在其中添加逻辑以确保它相同

例如使用id字段的Sample Post

public class Post {
    public String id;

    @Override
    public boolean equals(Object obj) {
        return super.equals(((Post)obj).id.equals(this.id));
    }

    @Override
    public int hashCode() {
        return id.hashCode();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM