2017-06-01 114 views
0

我正在开发一个聊天应用程序。在这个应用程序,我想排序联系人列表与最新的消息时间戳。Recyclerview没有更新?

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

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

      } 

在这里setAdapter工作正常,更新完整recyclerview与setAdapter工作正常。但它会重新载入全部视图,包括图像和用户消息等所有数据。所以我只想刷新索引而不需要再次加载所有数据。

关于上面的代码。适应是一个布尔值。它的初始值是错误的。并将适配器初始值更改为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(); 
    } 


    } 

那么我做错了什么?

+0

我猜 - chnaging“ob1.clear() ;”到'this.ob1.clear();'将解决你的问题, –

+0

试过但仍然没有成功... @SanjeetAjnabee – Bucky

回答

0

您只需将值添加到您的ob1对象并致电adapter.notifyDataSetChanged();即可更新您的列表。

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

+0

我认为这就是我在做的更新列表方法 – Bucky

+0

不完全是。您正在清除数组列表并重新填充它。这会触发完整的刷新。只需将您的主要活动(或以前的任何地方)中的条目添加到您的适配器的列表中,然后再调用adapter.notifyDataSetChanged。 – Prexx

0

你存储你的活动的ArrayList参考到您的适配器的ArrayList参考:在适配器构造

this.ob1 = ob1; 

变化,尝试了一次:

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

试过这个。但是仍然没有更新... – Bucky

+0

当你正在调用“if(!改编){chatLists.setAdapter(adapter); adaptor = true; } else else {adapter.updateList(ob1,getActivity(),fusername); }“? –

+0

它位于Firebase值事件侦听器中。所以当这个值改变时它会被调用。 – Bucky