Android 数据正在添加到列表中,而不是在addChildEventListener';中更新;s onChildChanged()

Android 数据正在添加到列表中,而不是在addChildEventListener';中更新;s onChildChanged(),android,arraylist,firebase-realtime-database,android-recyclerview,Android,Arraylist,Firebase Realtime Database,Android Recyclerview,我在firebase中有一些数据,这些数据在某些特定操作中会发生更改,我希望这些更改能够显示在应用程序中 我有一个RecyclerView,其中来自firebase的所有数据都被填充 以下是代码: databaseReference.child("uListings").child(AccessToken.getCurrentAccessToken().getUserId()).addChildEventListener(new ChildEventListener() {

我在firebase中有一些数据,这些数据在某些特定操作中会发生更改,我希望这些更改能够显示在应用程序中

我有一个
RecyclerView
,其中来自firebase的所有数据都被填充

以下是代码:

    databaseReference.child("uListings").child(AccessToken.getCurrentAccessToken().getUserId()).addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                // recyclerview gets populated here
            }

            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {
                if (dataSnapshot.getValue() != null) {
                    Map<String,String> map = (Map<String,String>)dataSnapshot.getValue();
                    Map<ArrayList<String>,ArrayList<String>> map2 = (Map<ArrayList<String>,ArrayList<String>>)dataSnapshot.getValue();
                    String pDescription = map.get("pDescription");
                    String pDuration = map.get("pDuration");
                    String pPrice = map.get("pPrice");
                    String postedAt = map.get("postedAt");
                    String views = map.get("views");
                    ArrayList<String> imageUrl = map2.get("imageUrl");

                            if (imageUrl != null) {
                                UHandler pHandler = new UHandler(imageUrl.get(0), pDescription, pDuration, pPrice, postedAt, views);
                                list.add(pHandler);
                                adapter.notifyDataSetChanged();
                                progressBar.setVisibility(View.INVISIBLE);
                            } else {
                                Toast.makeText(getBaseContext(), "imageUrlNone", Toast.LENGTH_SHORT).show();
                            }

                } else {
                    Log.d("PDPchange", "NULL");
                    progressBar.setVisibility(View.INVISIBLE);
                }
            }

            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {

            }

            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String s) {

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
问题在于,在
onChildChanged()
中,被更改的
视图
在列表中添加一个完整的其他项,反映其更改的值,而不仅仅是在
onChildAdded()
中先前添加的项中更新


如何在以前添加的项目中更新它?

您可以存储
键来更新它,例如:

 ArrayList<String> mKeys = new ArrayList<String>();  

databaseReference.child("uListings").child(AccessToken.getCurrentAccessToken().getUserId()).addChildEventListener(new ChildEventListener() {
                    @Override
                    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                        // recyclerview gets populated here

                        String key = dataSnapshot.getKey();
                        mKeys.add(key);
                        adapter.notifyDataSetChanged();

                    }

                    @Override
                    public void onChildChanged(DataSnapshot dataSnapshot, String s) {
                        if (dataSnapshot.getValue() != null) {
                             .......
                             //now we get the index to update specific value
                              String key = dataSnapshot.getKey();
                              int index = mKeys.indexOf(key);
                              list.set(index, pHandler);

                              adapter.notifyDataSetChanged();
                              ....
                    }
ArrayList mKeys=new ArrayList();
databaseReference.child(“uListings”).child(AccessToken.getCurrentAccessToken().getUserId()).addChildEventListener(new ChildEventListener()){
@凌驾
公共void onChildAdded(DataSnapshot DataSnapshot,字符串s){
//回收视图在这里填充
String key=dataSnapshot.getKey();
添加(键);
adapter.notifyDataSetChanged();
}
@凌驾
公共void onChildChanged(DataSnapshot DataSnapshot,字符串s){
if(dataSnapshot.getValue()!=null){
.......
//现在我们得到了更新特定值的索引
String key=dataSnapshot.getKey();
int index=mKeys.indexOf(键);
list.set(index,pHandler);
adapter.notifyDataSetChanged();
....
}

您可以存储
键来更新它,例如:

 ArrayList<String> mKeys = new ArrayList<String>();  

databaseReference.child("uListings").child(AccessToken.getCurrentAccessToken().getUserId()).addChildEventListener(new ChildEventListener() {
                    @Override
                    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                        // recyclerview gets populated here

                        String key = dataSnapshot.getKey();
                        mKeys.add(key);
                        adapter.notifyDataSetChanged();

                    }

                    @Override
                    public void onChildChanged(DataSnapshot dataSnapshot, String s) {
                        if (dataSnapshot.getValue() != null) {
                             .......
                             //now we get the index to update specific value
                              String key = dataSnapshot.getKey();
                              int index = mKeys.indexOf(key);
                              list.set(index, pHandler);

                              adapter.notifyDataSetChanged();
                              ....
                    }
ArrayList mKeys=new ArrayList();
databaseReference.child(“uListings”).child(AccessToken.getCurrentAccessToken().getUserId()).addChildEventListener(new ChildEventListener()){
@凌驾
公共void onChildAdded(DataSnapshot DataSnapshot,字符串s){
//回收视图在这里填充
String key=dataSnapshot.getKey();
添加(键);
adapter.notifyDataSetChanged();
}
@凌驾
公共void onChildChanged(DataSnapshot DataSnapshot,字符串s){
if(dataSnapshot.getValue()!=null){
.......
//现在我们得到了更新特定值的索引
String key=dataSnapshot.getKey();
int index=mKeys.indexOf(键);
list.set(index,pHandler);
adapter.notifyDataSetChanged();
....
}


首先,您在
ArrayList imageUrl=map2.get(“imageUrl”);
map.get(对象键)上有一个bug
不是类型安全的,即。如果您提供了错误类型的密钥,编译器不会抱怨。有关详细信息,请参阅。@alan7678好的。感谢您指出它。还请回答问题。假设
UHandler
是您的视图模型,如果您不想要新项,就不应该使用
new
。因此,简单地说,不要使用它
新建
不要使用
列表。添加
,使用
列表。获取
以检索对象并更新它。@alan7678如何使用列表检索对象。获取此处。无法知道此处的位置,因为列表中的任何项目都可以更新数据。您的意思是有新数据添加到适配器或firebase中?如果有首先,您可能需要在此处提供适配器。首先,您在
ArrayList imageUrl=map2.get(“imageUrl”);
map.get(对象键)上有一个错误
不是类型安全的,即。如果您提供了错误类型的密钥,编译器不会抱怨。有关详细信息,请参阅。@alan7678好的。感谢您指出它。还请回答问题。假设
UHandler
是您的视图模型,如果您不想要新项,就不应该使用
new
。因此,简单地说,不要使用它
新建
不要使用
列表。添加
,使用
列表。获取
以检索对象并更新它。@alan7678如何使用列表检索对象。获取此处。无法知道此处的位置,因为列表中的任何项目都可以更新数据。您的意思是有新数据添加到适配器或firebase中?如果有st choice,您可能需要在此处提供适配器。此操作有效!将在14小时后奖励赏金(由StackOverflow提示)@HammadNasir我不知道这个库是怎么工作的,抱歉。嗯。我认为它需要的只是一个逻辑,而不是库中的任何功能。你能仔细看看这个问题吗?没办法,兄弟?萨拉姆。请看一下这个:这个成功了!14小时后将奖励赏金(根据StackOverflow的提示)@HammadNasir我不知道这个库是怎么工作的,抱歉。嗯。我认为它需要的只是一个逻辑,而不是库中的任何功能。你能仔细看看这个问题吗?没办法,兄弟?萨拉姆。请看一下这个: