java - 更新 ListView 不起作用

标签 java android listview

所以基本上我是从 ListView 中的 json url 收集数据。这是一种聊天室类型的应用程序,在列表中我想将聊天室联系人列表与最新消息和时间戳同步。

当 json 更新时,我将调用该函数。

 public void addGroupAdapter() {
        Firebase jsonurl = new Firebase("firebase url");
        jsonurl.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                ContactListAdapter adapter = new ContactListAdapter(getContext(),dataSnapshot);
            try {
                Log.i("Response Array fire",new JSONArray(dataSnapshot.getValue(String.class)).toString());
                if (!adapted){
                    chatLists.setAdapter(adapter);
                    adapted = true;
                }else {
                    Log.i("update",dataSnapshot.getValue(String.class));
                    adapter.setContactList(dataSnapshot);
                }

            } catch (JSONException e) {
                e.printStackTrace();
            }
            }

            @Override
            public void onCancelled(FirebaseError firebaseError) {

            }
        });

该 Json 数据存储在 firebase 数据库中。

chatLists.setAdapter(adapter) 效果很好。

但是当我尝试更新时。 notifyDataSetChanged(); 不起作用。

 new ContactListAdapter(getContext(),dataSnapshot).notifyDataSetChanged();

我也尝试过invalidateviews方法并得到相同的结果。那么我哪里做错了?

阅读答案后我尝试了这个。现在这是我的适配器类,

class ContactListAdapter extends BaseAdapter {
        Context c;
        List lists;
        Type type = new TypeToken<List<ChatroomLists>>(){}.getType();
        JsonParser parser = new JsonParser();
        ArrayList<ChatroomLists> ob1 = new ArrayList<ChatroomLists>();

        public void setContactList(DataSnapshot dataSnapshot) {
            Type listType = new TypeToken<ArrayList<ChatroomLists>>() {
            }.getType();
            ob1 = new Gson().fromJson((JsonArray)parser.parse(dataSnapshot.getValue(String.class)),listType);
        Log.i("setContactList",dataSnapshot.getValue(String.class));

            notifyDataSetChanged();
        }

        ContactListAdapter(Context c, DataSnapshot group_name) {
            this.c = c;
            this.groupids = group_name;
            Type listType = new TypeToken<ArrayList<ChatroomLists>>() {
            }.getType();
            ob1 = new Gson().fromJson((JsonArray)parser.parse(group_name.getValue(String.class)),listType);



        }


        @Override
        public int getCount() {

            return ob1.size();
        }

        @Override
        public Object getItem(int position) {
            return position;
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {

            View row = convertView;
            GroupChat.viewHolder holder = null;

            if (row == null) {
                LayoutInflater inflater = (LayoutInflater) c.getSystemService (Context.LAYOUT_INFLATER_SERVICE);
                row = inflater.inflate (R.layout.chat_list_style, parent, false);
                holder = new GroupChat.viewHolder(row);
                row.setTag (holder);
            } else {
                holder = (GroupChat.viewHolder) row.getTag ();

            }

            ChatroomLists chatroomLists =  ob1.get(position);
            Iterator<ChatroomLists> iter = ob1.iterator();
            String id = chatroomLists.getId();
            String time = chatroomLists.getTimestamp();
            Log.i("updated data",id + time);

            viewHolder finalHolder = holder;
            Firebase chatlink = new Firebase ("firebase link");
            chatlink.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for (DataSnapshot d: dataSnapshot.getChildren()){
                        finalHolder.user_message.setText (dataSnapshot.child(d.getKey()).child("message").getValue(String.class));

                    }
                }

                @Override
                public void onCancelled(FirebaseError firebaseError) {

                }
            });


            Firebase imageurl = new Firebase("firebase link");
            imageurl.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    Glide.with (getActivity ())
                            .load (dataSnapshot.getValue(String.class))
                            .error (R.drawable.man)
                            .into (finalHolder.user_img);
                }

                @Override
                public void onCancelled(FirebaseError firebaseError) {

                }
            });

            holder.user_name.setText (id);

            row.setOnClickListener (new View.OnClickListener () {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent (getActivity (), ChatRoom.class);
                    intent.putExtra ("group_name", id);
                    startActivity (intent);
                }
            });
            registerForContextMenu (row);
            return row;
        }
    }

但它仍然没有更新..:(

更新:Listview 在这种情况下是如此错误。然后我就改成Recyclerview了。现在一切都很顺利。

最佳答案

这是因为您正在创建新的适配器实例,而不是更新在 list/recyclerview 上设置的现有适配器上的数据。

    private ContactListAdapter mAdatper;

    public void addGroupAdapter() {
        Firebase jsonurl = new Firebase("firebase url");
        jsonurl.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                try {
                    Log.i("Response Array fire",new JSONArray(dataSnapshot.getValue(String.class)).toString());
                    if (!adapted){
                        mAdatper = new ContactListAdapter(getContext(),dataSnapshot);
                        chatLists.setAdapter(mAdapter);
                        adapted = true;
                    }else {
                        Log.i("update",dataSnapshot.getValue(String.class));
                        mAdatper.setContactList(dataSnapshot);                
                    }

                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onCancelled(FirebaseError firebaseError) {

            }
        });
    }

在您的适配器中,添加 setter 方法。

public void setContactList(DataSnapshot dataSnapshot) {
    // set contactList here
    notifyDataSetChanged();
}

希望对您有帮助。

关于java - 更新 ListView 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43591955/

相关文章:

java - 将 int 值关联到 enum 并获取相应的 int 值

java - 您如何检查用户是否在打开应用程序时购买了应用程序内购买?

java - 过滤请求JPQL(查找列表中不包含具有特定id的元素的条目)

android - 如何使用 Google Analytics for Android 跟踪用户偏好?

java - 实现 SimpleCursorAdapter 时出错

android - CustomAdapter 中的 ListView Checkbox 问题

android - ListView 中的多个 TextView?

java - 如何随机化 TextView 的重力 - Android Eclipse

java - 如果文件在 Assets 目录下,如何将文件名作为字符串获取?

android - 运行 Android Studio 项目时出现 DX 错误