如何获取在addValueEventListener内部更新的arraylist的值?

时间:2018-06-27 06:16:20

标签: java android asynchronous arraylist firebase-realtime-database

我想显示通过查询得到的listview中的ArrayList。 尽管ArrayList pt in addValueEventListener被声明为静态属性,但null成为addValueEventListener之外的ArrayList。 有没有办法在ArrayList

之外获取eventlistener?的值
query.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        if(dataSnapshot!=null) {
            Log.e("TAG", String.valueOf(dataSnapshot.child("uid").child("Name")));
            int i=0;
            for(DataSnapshot snapshot : dataSnapshot.getChildren()){
                String userName = snapshot.child("Name").getValue(String.class);
                Pt.add(userName);
                //Toast.makeText(getApplicationContext(),  dataSnapshot.toString(), Toast.LENGTH_SHORT).show();
            }
        } else {
            Toast.makeText(getApplicationContext(), "Datasnapshot is null", Toast.LENGTH_SHORT).show();
         }
    }

2 个答案:

答案 0 :(得分:0)

尝试此代码。

       this.mouseCapture.acquire(evt, {
            mouseMove: () => {
                if (!dragging) {
                    let x1 = Math.abs(evt.pageX - x);
                    let y1 = Math.abs(evt.pageY - y);
                    if (x1 > this.threshold || y1 > this.threshold) {
                        dragging = true;

                        if (config.dragStarted) {
                            config.dragStarted(x, y, evt);
                        }

                        if (config.dragging) {
                            // First 'dragging' call to take into account that we have
                            // already moved the mouse by a 'threshold' amount.
                            config.dragging(evt.pageX, evt.pageY, evt);
                        }
                    }
                } else {
                    if (config.dragging) {
                        config.dragging(evt.pageX, evt.pageY, evt);
                    }

                    x = evt.pageX;
                    y = evt.pageY;
                }
            },
            mouseUp: () => {
                console.log('dragging.service.ts :   mouseUp');
                this.mouseCapture.release();
                evt.stopPropagation();
                evt.preventDefault();
            },
            released: () => {
                console.log('dragging.service.ts :  released');
                if (dragging) {
                    if (config.dragEnded) {
                        config.dragEnded();
                    }
                } else {
                    if (config.clicked) {
                        config.clicked();
                    }
                }
            },
        });

答案 1 :(得分:0)

由于此方法的异步行为,您的Pt列表将始终位于empty之外的onDataChange()处。这意味着,当您尝试使用此方法之外的Pt列表时,数据尚未完成从数据库的加载,因此无法访问。

该问题的快速解决方案是仅在Pt方法内部使用onDataChange()列表,或者如果您想在外部使用它,我建议您从此查看我的答案的最后一部分 post ,其中我解释了如何使用自定义回调来完成。您也可以查看此 video 以获得更好的理解。