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值事件侦听器中。因此,当值更改时,会调用它。