更新列表视图不起作用

时间:2017-04-24 15:22:16

标签: 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。现在一切顺利。

3 个答案:

答案 0 :(得分:1)

每次都在适配器的新实例上调用notifyDataSetChanged()。您应该在列表上设置的同一个适配器上调用它。您应该更新适配器的特定实例中的数据

答案 1 :(得分:1)

在你的其他情况下,你正在创建一个新的ContactListAdapter,但你没有将该适配器附加到你的聊天列表。无论如何,您不需要创建新的CustomAdapter实例,只需在CustomAdapter中创建更新方法并调用它来传递新的dataSnapshot数据。

您可以在 CustomAdapter.java 中尝试以下内容:

public void updateData(Data data) {
    this.dataList = data;
    notifyDataSetChanged();
}

然后返回 addGroupAdapter 方法,只需调用该方法

答案 2 :(得分:1)

这是因为您正在创建新的适配器实例,而不是更新在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();
}

希望它对你有帮助。