Básicamente, estoy recopilando datos de una url json en mi vista de lista. Es un tipo de aplicación de sala de chat y en las listas quiero sincronizar las listas de contactos de la sala de chat con los últimos mensajes y marcas de tiempo.

Cuando la json se actualiza estoy llamando a la función.

 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) {

            }
        });

Los datos de Json se almacenan en la base de datos de Firebase.

chatLists.setAdapter(adapter) funciona bien.

Pero cuando trato de actualizar. notifyDataSetChanged(); no funciona.

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

También probé el método invalidateviews y el mismo resultado. Entonces, ¿dónde estoy haciendo mal?

Después de leer las respuestas, probé esto. Así que ahora esta es mi clase de adaptador,

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;
        }
    }

Pero todavía no se está actualizando ... :(

ACTUALIZACIÓN: Listview tenía muchos errores en este caso. Y me cambié a Recyclerview. Ahora todo funciona sin problemas.

0
Doge 24 abr. 2017 a las 18:22

3 respuestas

La mejor respuesta

Esto se debe a que está creando una nueva instancia de adaptador en lugar de actualizar datos en el adaptador existente que está configurado en list / recyclingview.

    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) {

            }
        });
    }

En su adaptador, agregue el método setter.

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

Espero que te sea útil.

1
Arkar Aung 24 abr. 2017 a las 15:30

Está llamando a notifyDataSetChanged() en una nueva instancia del adaptador cada vez. Debe llamarlo en el mismo adaptador que configuró en la lista. Y debe actualizar los datos en esa instancia particular del adaptador

1
Ravjit Singh 24 abr. 2017 a las 15:26

En su caso, está creando un nuevo ContactListAdapter pero no está conectando ese adaptador a sus listas de chat. De todos modos, no necesita crear una nueva instancia de CustomAdapter, solo cree un método de actualización dentro de su CustomAdapter y llámelo pasando nuevos datos dataSnapshot.

Puede probar algo como lo siguiente dentro de su CustomAdapter.java :

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

Luego, nuevamente en su método addGroupAdapter simplemente llame a ese método

1
AlexTa 24 abr. 2017 a las 15:28