Java Recyclerview没有更新吗?

Java Recyclerview没有更新吗?,java,android,android-recyclerview,Java,Android,Android Recyclerview,我正在开发一个聊天应用程序。在这个应用程序中,我想用最新的消息时间戳对联系人列表进行排序 adapter = new ContactListAdapter(ob1, getActivity(), fusername); if (!adapted) { chatLists.setAdapter(adapter); adapted = true; }else {

我正在开发一个聊天应用程序。在这个应用程序中,我想用最新的消息时间戳对联系人列表进行排序

     adapter = new ContactListAdapter(ob1, getActivity(), fusername);

            if (!adapted) {
                chatLists.setAdapter(adapter);
                adapted = true;
            }else {
                adapter.updateList(ob1, getActivity(), fusername);

            }
在这里,setAdapter工作正常,使用setAdapter更新完整的recyclerview也工作正常。但它会重新加载包含图像和用户消息等所有数据的完整视图。所以我只想刷新索引,而不必再次加载所有数据

关于上述代码。这是一个布尔值。它的初始值为false。设置适配器后,初始值将更改为true。然后,为了更新适配器,我调用updateList函数

public class ContactListAdapter extends RecyclerView.Adapter<ContactListAdapter.viewHolder>{
    com.google.firebase.database.DataSnapshot d;
    Context c;
    JsonParser parser = new JsonParser();
    String username;
    ArrayList<ChatroomLists> ob1 = new ArrayList<ChatroomLists>();


public ContactListAdapter(ArrayList<ChatroomLists> ob1, Context c, String fusername) {
    this.c = c;
    this.username = fusername;
    this.ob1.addAll(ob1);

}
public void updateList(ArrayList<ChatroomLists> ob1, Context c, String fusername) {
    this.ob1.clear();
    this.ob1.addAll(ob1);
    this.notifyDataSetChanged();


}


    public class viewHolder extends RecyclerView.ViewHolder {
        CircleImageView user_img;
        ImageView message_stats;
        TextView user_name;
        TextView user_message;
        TextView timestamp;
        CircleImageView unreadbadge;

        public viewHolder(View itemView) {
            super(itemView);
            user_img = (CircleImageView) itemView.findViewById (R.id.user_img_list);
            user_name = (TextView) itemView.findViewById (R.id.contact_name);
            user_message = (TextView) itemView.findViewById (R.id.user_message);
            message_stats = (ImageView) itemView.findViewById (R.id.message_status);
            timestamp = (TextView)itemView.findViewById(R.id.time);
            unreadbadge = (CircleImageView) itemView.findViewById(R.id.unread);
        }
    }

    @Override
    public viewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from (parent.getContext ()).inflate (R.layout.chat_list_style, parent, false);

        return new viewHolder(v);
    }

    @Override
    public void onBindViewHolder(viewHolder holder, int position) {
        ChatroomLists chatroomLists =  ob1.get(position);
        Iterator<ChatroomLists> iter = ob1.iterator();
        String id = chatroomLists.getId();
        String time = chatroomLists.getTimestamp();



        Handler h = new Handler();
        FirebaseDatabase.getInstance().getReference().child("unread").child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("chatrooms").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                try{
                    if (dataSnapshot.hasChild(id)){
                        holder.unreadbadge.setVisibility(View.VISIBLE);

                    }else {
                        holder.unreadbadge.setVisibility(View.GONE);

                    }
                }catch (Exception e){

                }

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
        new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
            @Override
            public void run() {
                try{
                    long mtime = TimeUnit.MILLISECONDS.toMinutes(System.currentTimeMillis())-TimeUnit.MILLISECONDS.toMinutes(Long.parseLong(time));
                    if (mtime<60){
                        holder.timestamp.setText(String.valueOf(mtime)+ " mins");
                        if (mtime==1)
                            holder.timestamp.setText(1+ " min");
                        else if (mtime<1){
                            holder.timestamp.setText("Just Now");

                        }
                        else
                            holder.timestamp.setText(mtime+ " mins");
                    }
                    else if (mtime>60 && mtime<1440){
                        if (mtime/60==1)
                            holder.timestamp.setText(String.valueOf(mtime/60)+ " hour");
                        else
                            holder.timestamp.setText(String.valueOf(mtime/60)+ " hours");
                    }
                    else if (mtime>=1440&&mtime<10080){
                        if (mtime/1440==1)
                            holder.timestamp.setText(String.valueOf(mtime/1440)+ " day");
                        else
                            holder.timestamp.setText(String.valueOf(mtime/1440)+ " days");
                    }else if(mtime>10080&&mtime<3679200){
                        if (mtime/10080==1)
                            holder.timestamp.setText(String.valueOf(mtime/10080)+ " week");
                        else
                            holder.timestamp.setText(String.valueOf(mtime/10080)+ " weeks");

                    }else if(mtime>3679200){
                        if (mtime/3679200==1)
                            holder.timestamp.setText(String.valueOf(mtime/3679200)+ " year");
                        else
                            holder.timestamp.setText(String.valueOf(mtime/3679200)+ " years");
                    }
                }catch (Exception e){

                }

                h.postDelayed(this,60000);
            }
        },60000);

        FirebaseDatabase.getInstance().getReferenceFromUrl("https://droidchatz.firebaseio.com/groupchat/" + id + "/chat").limitToLast(1).addValueEventListener(new com.google.firebase.database.ValueEventListener() {
            @Override
            public void onDataChange(com.google.firebase.database.DataSnapshot dataSnapshot) {
                for (com.google.firebase.database.DataSnapshot d: dataSnapshot.getChildren()){
                    if (dataSnapshot.child(d.getKey()).child("type").getValue(String.class).equals("text"))
                    holder.user_message.setText (dataSnapshot.child(d.getKey()).child("message").getValue(String.class));
                    else if(dataSnapshot.child(d.getKey()).child("type").getValue(String.class).equals("video"))
                        holder.user_message.setText ("New Video Message");

                    else if(dataSnapshot.child(d.getKey()).child("type").getValue(String.class).equals("image"))
                        holder.user_message.setText ("New Image Message");

                    else if(dataSnapshot.child(d.getKey()).child("type").getValue(String.class).equals("gif"))
                        holder.user_message.setText ("New GIF Message");

                    else if(dataSnapshot.child(d.getKey()).child("type").getValue(String.class).equals("file"))
                        holder.user_message.setText ("New Document");

                    else {
                        holder.user_message.setText (dataSnapshot.child(d.getKey()).child("message").getValue(String.class));

                    }

                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

        FirebaseDatabase.getInstance().getReferenceFromUrl("https://droidchatz.firebaseio.com/groups/"+id+"/image").addListenerForSingleValueEvent(new com.google.firebase.database.ValueEventListener() {
            @Override
            public void onDataChange(com.google.firebase.database.DataSnapshot dataSnapshot) {
                try{
                    Glide
                            .with(c)
                            .load(dataSnapshot.getValue(String.class))
                            .asBitmap()
                            .diskCacheStrategy(DiskCacheStrategy.ALL)

                            .dontAnimate()
                            .into(new SimpleTarget<Bitmap>() {

                                @Override
                                public void onResourceReady(Bitmap arg0, GlideAnimation<? super Bitmap> arg1) {
                                    holder.user_img.setImageBitmap(arg0);
                                }});



                }catch (Exception e){

                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });


        holder.user_name.setText (id);

        holder.itemView.setOnClickListener (new View.OnClickListener () {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent (c, ChatRoom.class);
                intent.putExtra("username",username);
                intent.putExtra ("group_name", id);

                c.startActivity (intent);
            }
        });

    }

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

    @Override
    public int getItemViewType(int position) {
        return position;
    }

    @Override
    public int getItemCount() {
        return ob1.size();
    }


    }
公共类ContactListAdapter扩展了RecyclerView.Adapter{
com.google.firebase.database.DataSnapshot d;
上下文c;
JsonParser=新的JsonParser();
字符串用户名;
ArrayList ob1=新的ArrayList();
公共ContactListAdapter(ArrayList ob1、上下文c、字符串fusername){
这个.c=c;
this.username=fusername;
本.ob1.addAll(ob1);
}
公共void updateList(ArrayList ob1、上下文c、字符串fusername){
this.ob1.clear();
本.ob1.addAll(ob1);
this.notifyDataSetChanged();
}
公共类viewHolder扩展了RecyclerView.viewHolder{
CircleImageView用户界面;
ImageView消息_stats;
TextView用户名;
TextView用户信息;
文本视图时间戳;
CircleImageView未备份;
公共视图持有者(视图项视图){
超级(项目视图);
user\u img=(CircleImageView)itemView.findViewById(R.id.user\u img\u list);
user_name=(TextView)itemView.findViewById(R.id.contact_name);
user\u message=(TextView)itemView.findViewById(R.id.user\u message);
message_stats=(ImageView)itemviewbyd(R.id.message_status);
timestamp=(TextView)itemView.findViewById(R.id.time);
UnreadEdge=(CircleImageView)itemView.findViewById(R.id.unread);
}
}
@凌驾
public viewHolder onCreateViewHolder(视图组父级,int-viewType){
视图v=LayoutInflater.from(parent.getContext()).flate(R.layout.chat\u list\u样式,parent,false);
返回新的视图持有者(v);
}
@凌驾
公共无效onBindViewHolder(viewHolder,int位置){
聊天室列表聊天室列表=ob1.get(位置);
迭代器iter=ob1.Iterator();
String id=chatroomLists.getId();
字符串时间=聊天室列表。getTimestamp();
Handler h=新的Handler();
FirebaseDatabase.getInstance().getReference().child(“未读”).child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child(“聊天室”).addValueEventListener(新的ValueEventListener()){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
试一试{
if(dataSnapshot.hasChild(id)){
holder.UnreadEdge.setVisibility(View.VISIBLE);
}否则{
holder.unreadEdge.setVisibility(View.GONE);
}
}捕获(例外e){
}
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
新处理程序(Looper.getMainLooper()).postDelayed(newrunnable()){
@凌驾
公开募捐{
试一试{
long mtime=TimeUnit.millides.toMinutes(System.currentTimeMillis())-TimeUnit.millides.toMinutes(long.parseLong(time));

如果(mtime您只需向
ob1
对象添加值并调用
适配器.notifyDataSetChanged();
即可更新列表


仅初始化适配器一次并填充
ob1
列表。

您正在将活动ArrayList引用存储到适配器ArrayList引用中:

  this.ob1 = ob1;
更改适配器构造函数,请尝试一次:

 public ContactListAdapter(ArrayList<ChatroomLists> ob1, Context c, String fusername) {
    this.c = c;
    this.username = fusername;
    this.ob1.addAll(ob1);
}
公共联系人列表适配器(ArrayList ob1、上下文c、字符串fusername){ 这个.c=c; this.username=fusername; 本.ob1.addAll(ob1); }
我猜-chning'ob1.clear();'到'this.ob1.clear();'将解决您的问题,尝试过但仍然没有成功…@sanjeetajnabei认为这就是我在updatelist方法中所做的不完全正确。您正在清除arraylist并再次填充它。这将触发完全刷新。只需在mainactivity中添加或删除条目即可(或者在任何地方)您将列表交给适配器,然后调用adapter.notifyDataSetChanged。当您调用“if(!adapted){chatLists.setAdapter(adapter);adapted=true;}else{adapter.updateList(ob1,getActivity(),fusername);}”时?它位于firebase值事件侦听器中。因此,当值更改时,会调用它。