I am using firebase real time database. I have an app with messaging feature. In the message box, I show the messages with a custom adapter. The user can only see the last 15 incoming messages. I want 10 more messages to be loaded automatically when it gets to the bottom. How can I do that?
RecyclerView recyclerViewlist;
ProgressBar messageref ;
LinearLayoutManager linearLayoutManager ;
private final List<ModelMessageFragment> postListnew =new ArrayList<>();
private AdapterMessageFragment adapterMessageFragment ;
private int itemPos = 0;
private String mLastKey = "";
private String mPrevKey = "";
static final int total_ITEMS = 15 ;
int currentpage = 1 ;
mAuth = FirebaseAuth.getInstance();
FirebaseUser mFirebaseUser = mAuth.getCurrentUser();
if(mFirebaseUser != null) {
currentUserID = mFirebaseUser.getUid();
Lastrefnew = FirebaseDatabase.getInstance().getReference().child("LastMessage").child(currentUserID);
adapterMessageFragment = new AdapterMessageFragment(postListnew);
recyclerViewlist.setHasFixedSize(true);
linearLayoutManager = new LinearLayoutManager(getContext());
linearLayoutManager.setReverseLayout(true);
linearLayoutManager.setStackFromEnd(true);
recyclerViewlist.setLayoutManager(linearLayoutManager);
recyclerViewlist.setAdapter(adapterMessageFragment);
getallmessage();
public void getallmessage (){
Query query = Lastrefnew.orderByChild("timestamp").limitToLast(currentpage * total_ITEMS);
query.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
messageref.setVisibility(View.GONE);
try {
ModelMessageFragment post = dataSnapshot.getValue(ModelMessageFragment.class);
itemPos++;
if(itemPos == 1){
String messageKey = dataSnapshot.getKey();
mLastKey = messageKey;
mPrevKey = messageKey;
}
postListnew.add(post);
adapterMessageFragment.notifyDataSetChanged();
recyclerViewlist.smoothScrollToPosition(recyclerViewlist.getAdapter().getItemCount());
recyclerViewlist.scrollToPosition(postListnew.size() - 1);
messageref.setVisibility(View.GONE);
recyclerViewlist.setVisibility(View.VISIBLE);
}catch (Exception e){
}
}
@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
if (messageref != null) {
messageref.setVisibility(View.GONE);
}
}
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
xml
<com.orangegangsters.github.swipyrefreshlayout.library.SwipyRefreshLayout
android:id="@+id/messagerefresh"
android:layout_marginTop="5dp"
android:layout_marginLeft="5dp"
android:layout_below="@id/appbarmessagechat"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<androidx.recyclerview.widget.RecyclerView
android:layout_below="@id/appbarmessagechat"
android:id="@+id/recyclerViewlist"
android:layout_marginTop="3dp"
android:layout_width="match_parent"
android:layout_height="match_parent">
</androidx.recyclerview.widget.RecyclerView>
</com.orangegangsters.github.swipyrefreshlayout.library.SwipyRefreshLayout>
AdapterMessageFragment
public class AdapterMessageFragment extends RecyclerView.Adapter<AdapterMessageFragment.MessageFragmentViewHolder> {
private List<ModelMessageFragment> postListnew;
private FirebaseAuth mAuth;
String currentUserid ;
int[] photos={ R.drawable.c, R.drawable.e, R.drawable.xz,
R.drawable.xzz, R.drawable.xzzz,R.drawable.kk,
};
public AdapterMessageFragment(List<ModelMessageFragment> postListnew) {
this.postListnew = postListnew ;
}
public class MessageFragmentViewHolder extends RecyclerView.ViewHolder{
CircleImageView profileImage ;
ImageView onlinestatus , seenstatus;
TextView userName , userTime , messageinfooo;
View mView;
public MessageFragmentViewHolder(@NonNull View itemView) {
super(itemView);
profileImage =itemView.findViewById(R.id.messageprofileimageee);
userName =itemView.findViewById(R.id.messagenameee);
onlinestatus =itemView.findViewById(R.id.onlinestatus);
seenstatus =itemView.findViewById(R.id.seenstatus);
userTime =itemView.findViewById(R.id.messagetime);
messageinfooo =itemView.findViewById(R.id.messageinfooo);
}
}
@Override
public MessageFragmentViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
View menuItemLayoutView = LayoutInflater.from(viewGroup.getContext()).inflate(
R.layout.message_list_model, viewGroup, false);
return new MessageFragmentViewHolder(menuItemLayoutView);
}
@Override
public void onBindViewHolder(@NonNull MessageFragmentViewHolder holder, int i) {
mAuth = FirebaseAuth.getInstance();
currentUserid = mAuth.getCurrentUser().getUid();
ModelMessageFragment post = (ModelMessageFragment) postListnew.get(i);
Random ran=new Random();
int ii=ran.nextInt(photos.length);
holder.profileImage.setImageResource(photos[ii]);
DatabaseReference UsersRef = FirebaseDatabase.getInstance().getReference().child("Users");
String usersIDs = post.getC();
UsersRef.child(usersIDs).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
if (snapshot.hasChild("name")){
final String myUsername = snapshot.child("name").getValue().toString();
holder.userName.setText(myUsername);
}
if (snapshot.hasChild("photoid")){
final String userphoto = snapshot.child("photoid").getValue().toString();
if (userphoto.equals("alien")){
holder.profileImage.setImageResource(R.drawable.alien50);
}else if (userphoto.equals("dragon")){
holder.profileImage.setImageResource(R.drawable.dragon50);
}else if (userphoto.equals("pug")){
holder.profileImage.setImageResource(R.drawable.pug50);
}else if (userphoto.equals("doge")){
holder.profileImage.setImageResource(R.drawable.doge50);
}else {
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
String getlastseen = post.getS();
try {
if (getlastseen.equals("notseen")){
Typeface boldTypeface = Typeface.defaultFromStyle(Typeface.BOLD);
holder.messageinfooo.setTypeface(boldTypeface);
holder.userTime.setTypeface(boldTypeface);
holder.userName.setTypeface(boldTypeface);
holder.userTime.getResources().getColor(R.color.messagefragmentnotseen);
holder.userName.getResources().getColor(R.color.messagefragmentnotseen);
holder.messageinfooo.getResources().getColor(R.color.messagefragmentnotseen);
holder.seenstatus.setVisibility(View.VISIBLE);
}else {
}
}catch (Exception e){
}
holder.messageinfooo.setText(post.getL());
String groupdate = post.getT();
Long Timestamp2 = Long.parseLong(groupdate);
Date timeD = new Date(Timestamp2 * 1000);
SimpleDateFormat sdf = new SimpleDateFormat("dd-MMMM-yyyy hh:mm:ss aa");
String Time = sdf.format(timeD);
String gettime = zaman2(Time);
holder.userTime.setText(gettime);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent chatintent = new Intent(v.getContext(), Chat.class);
chatintent.putExtra("visit_user_id",post.getC());
v.getContext().startActivity(chatintent);
}
});
@Override
public int getItemCount() {
return postListnew.size();
}
private String zaman2(String Time) {
SimpleDateFormat sdf = new SimpleDateFormat("dd-MMMM-yyyy hh:mm:ss aa");
try {
long time = sdf.parse(Time).getTime();
long now = System.currentTimeMillis();
CharSequence ago =
DateUtils.getRelativeTimeSpanString(time, now, DateUtils.MINUTE_IN_MILLIS);
return ago+"";
} catch (ParseException e) {
e.printStackTrace();
}
return "";
}
ModelMessageFragment
public class ModelMessageFragment {
public String l;
public String d;
public String t ;
public String s;
public String c;
public ModelMessageFragment(String l, String d, String t, String s, String c ) {
this.l = l;
this.d = d;
this.t = t;
this.s = s;
this.c = c;
}
public String getL() {
return l;
}
public void setL(String l) {
this.l = l;
}
public String getD() {
return d;
}
public void setD(String d) {
this.d = d;
}
public String getT() {
return t;
}
public void setT(String t) {
this.t = t;
}
public String getS() {
return s;
}
public void setS(String s) {
this.s = s;
}
public String getC() {
return c;
}
public void setC(String c) {
this.c = c;
}
public ModelMessageFragment() {
}
}