'Whenever I add new Data to FireStore DataBase and display it to recyclerView , it only shows the newly added data. Here is my Code :
The recycler view only shows the recent add i.e the single element which is newly added, and the rest of the activity is blank, Also whenever I switch fragments and visit again the main fragment it shows all data?
Place to display data and set Adapter:
public class HomeFragment extends Fragment {
private RecyclerView recyclerView;
private List<BlogPost> blogList;
private FirebaseFirestore firestore;
private FirebaseDatabase database;
private DatabaseReference reference;
private BlogPostAdapter adapter;
public HomeFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_home, container, false);
blogList = new ArrayList<>();
firestore = FirebaseFirestore.getInstance();
recyclerView = (RecyclerView)view.findViewById(R.id.post_list_view);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(view.getContext()));
EventChangeListener();
adapter = new BlogPostAdapter(blogList);
recyclerView.setAdapter(adapter);
return view;
}
public void EventChangeListener() {
Query firstQuery = firestore.collection("Posts").orderBy("TimeStamp",Query.Direction.ASCENDING);
firstQuery.addSnapshotListener(new EventListener<QuerySnapshot>() {
@SuppressLint("NotifyDataSetChanged")
@Override
public void onEvent(@Nullable QuerySnapshot value, @Nullable FirebaseFirestoreException error) {
if(error!=null)
{
Log.e("Firestore Error",error.getMessage());
return;
}
blogList.clear();
for(DocumentChange doc : value.getDocumentChanges())
{
if(doc.getType()== DocumentChange.Type.ADDED)
{
String blogPostId = doc.getDocument().getId();
QueryDocumentSnapshot post = doc.getDocument();
BlogPost blogPost = new BlogPost();
Map<String, Object> s = post.getData();
int[] likeCnt = {0};
blogPost.setPost_txt((String) s.get("Post_Content"));
DocumentSnapshot.ServerTimestampBehavior behavior = ESTIMATE;
blogPost.setTimestamp(post.getDate("TimeStamp", behavior));
blogPost.setUser_id((String) s.get("User"));
blogList.add(0,blogPost.withId(blogPostId));
}
}
adapter.notifyDataSetChanged();
}
});
}
**/*Adapter Code*/**
public class BlogPostAdapter extends RecyclerView.Adapter<BlogPostAdapter.ViewHolder> {
private List<BlogPost> blog_lists;
private FirebaseFirestore firestore;
private FirebaseAuth mAuth;
private Context context;
public BlogPostAdapter(List<BlogPost> lc)
{
this.blog_lists = lc;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
mAuth = FirebaseAuth.getInstance();
firestore = FirebaseFirestore.getInstance();
context = parent.getContext();
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_post_view,parent,false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, @SuppressLint("RecyclerView") int position) {
String blogPostId = blog_lists.get(position).blogPostId;
String sc = blog_lists.get(position).getPost_txt();
holder.postContent.setText(sc);
String currentUserId = mAuth.getCurrentUser().getUid();
long millisecond = blog_lists.get(position).getTimestamp().getTime();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MMM d,yyyy");
String dateString = simpleDateFormat.format(millisecond);
holder.date.setText(dateString);
firestore.collection("Posts/"+blogPostId+"/Likes").addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot value, @Nullable FirebaseFirestoreException error) {
if(!value.isEmpty())
{
int count = value.size();
holder.updateLikes(count);
}
else {
holder.updateLikes(0);
}
}
});
firestore.collection("Posts/" + blogPostId + "/Likes").document(currentUserId).addSnapshotListener(new EventListener<DocumentSnapshot>() {
@SuppressLint("UseCompatLoadingForDrawables")
@Override
public void onEvent(@Nullable DocumentSnapshot value, @Nullable FirebaseFirestoreException error) {
if (value.exists()) {
holder.likeBtn.setImageDrawable(context.getDrawable(R.drawable.action_liked));
} else {
holder.likeBtn.setImageDrawable(context.getDrawable(R.drawable.action_likebutton));
}
}
});
holder.likeBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
firestore.collection("Posts/"+blogPostId+"/Likes").document(currentUserId).get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if(!task.getResult().exists()){
Map<String,Object> mp = new HashMap<>();
mp.put("TimeStamp", FieldValue.serverTimestamp());
firestore.collection("Posts/"+blogPostId+"/Likes").document(currentUserId).set(mp);
}
else
{
firestore.collection("Posts/"+blogPostId+"/Likes")
.document(currentUserId).delete();
}
}
});
}
});
}
@Override
public int getItemCount() {
return blog_lists.size();
}
class ViewHolder extends RecyclerView.ViewHolder{
private TextView postContent,date,likeCnt;
private ImageView likeBtn;
public ViewHolder(@NonNull View itemView) {
super(itemView);
postContent = (TextView) itemView.findViewById(R.id.post_content);
date = (TextView) itemView.findViewById(R.id.date);
likeBtn = (ImageView) itemView.findViewById(R.id.like_btn);
likeCnt = (TextView) itemView.findViewById(R.id.likes_cnt);
}
public void updateLikes(int count)
{
likeCnt.setText(count+" Likes");
}
}
}
**// Model Class //***
public class BlogPost extends BlogPostId {
public String user_id,post_txt;
public Date TimeStamp;
int like_count;
public BlogPost(String post_txt)
{
this.post_txt = post_txt;
}
public BlogPost()
{
}
public BlogPost(String user_id, String post_txt,Date timestamp) {
this.user_id = user_id;
this.post_txt = post_txt;
this.TimeStamp = timestamp;
}
public BlogPost(String user_id, String post_txt, Date timeStamp, int like_count) {
this.user_id = user_id;
this.post_txt = post_txt;
TimeStamp = timeStamp;
this.like_count = like_count;
}
public void setLike_count(int like_count) {
this.like_count = like_count;
}
public String getUser_id() {
return user_id;
}
public void setUser_id(String user_id)
{
this.user_id = user_id;
}
public String getPost_txt() {
return post_txt;
}
public void setPost_txt(String post_txt) {
this.post_txt = post_txt;
}
public Date getTimestamp() {
return TimeStamp;
}
public void setTimestamp(Date timestamp) {
this.TimeStamp = timestamp;
}
public int getLike_count() {
return like_count;
}
}
**// Main Activity //**
public class MainActivity extends AppCompatActivity {
private androidx.appcompat.widget.Toolbar mainToolbar;
private ImageView addPost_btn;
private BottomNavigationView main_bottom_nav_view;
private FirebaseAuth mAuth;
private HomeFragment homeFragment;
private NotificationFragment notificationFragment;
private AccountFragment accountFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(isNetworkAvailable())
{
Toast.makeText(this, "Connected", Toast.LENGTH_SHORT).show();
}
else{
Toast.makeText(this, "Connection Unavailable", Toast.LENGTH_SHORT).show();
}
mAuth = FirebaseAuth.getInstance();
//Bottom navigation bar
main_bottom_nav_view = findViewById(R.id.mainBottomNav);
//Fragment
homeFragment = new HomeFragment();
notificationFragment = new NotificationFragment();
accountFragment = new AccountFragment();
//Post Button
addPost_btn = (ImageView) findViewById(R.id.addPostBtn);
replaceFragment(homeFragment);
addPost_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent post_Intent = new Intent(MainActivity.this,NewPostActivity.class);
startActivity(post_Intent);
}
});
main_bottom_nav_view.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch(item.getItemId())
{
case R.id.bottom_home:
replaceFragment(homeFragment);
return true;
case R.id.bottom_post:
replaceFragment(notificationFragment);
return true;
case R.id.bottom_acc:
replaceFragment(accountFragment);
return true;
default:
return false;
}
}
});
}
@Override
protected void onStart() {
super.onStart();
FirebaseUser currUser = FirebaseAuth.getInstance().getCurrentUser();
if(currUser==null)
{
sendToLogin();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_menu,menu);
return true;
}
private void sendToLogin() {
Intent login_Intent = new Intent(MainActivity.this,Login_Activity.class);
startActivity(login_Intent);
finish();
}
private void replaceFragment(Fragment newFragment)
{
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.main_container,newFragment);
fragmentTransaction.commit();
}
private boolean isNetworkAvailable() {
try{
ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = null;
if(manager!=null)
{
networkInfo = manager.getActiveNetworkInfo();
}
return networkInfo!=null && networkInfo.isConnected();
}
catch (NullPointerException e)
{
return false;
}
}
}
**// Adding New Data to Firebase FireStore**
public class NewPostActivity extends AppCompatActivity {
private EditText post_txt;
private ImageView post_btn;
private ProgressBar new_post_progress;
private StorageReference storageReference;
private FirebaseFirestore firestore;
private FirebaseAuth firebaseAuth;
private String currUser;
private Uri post_txtUri=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new_post);
post_txt = (EditText) findViewById(R.id.post_txt);
post_btn = (ImageView) findViewById(R.id.post_btn);
firebaseAuth = FirebaseAuth.getInstance();
currUser = firebaseAuth.getCurrentUser().getEmail();
new_post_progress = (ProgressBar) findViewById(R.id.new_post_progress);
storageReference = FirebaseStorage.getInstance().getReference().child("Post_Contents");
firestore = FirebaseFirestore.getInstance();
post_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String text = post_txt.getText().toString();
if(!TextUtils.isEmpty(text))
{
new_post_progress.setVisibility(View.VISIBLE);
String randomName = FieldValue.serverTimestamp().toString();
Map<String,Object> postMap = new HashMap<>();
postMap.put("Post_Content",text);
postMap.put("User",currUser);
postMap.put("TimeStamp",FieldValue.serverTimestamp());
firestore.collection("Posts").add(postMap).addOnCompleteListener(new OnCompleteListener<DocumentReference>() {
@Override
public void onComplete(@NonNull Task<DocumentReference> task) {
new_post_progress.setVisibility(View.INVISIBLE);
if(task.isSuccessful())
{
Toast.makeText(NewPostActivity.this,"Posted Successfully",Toast.LENGTH_SHORT).show();
Intent mainPage = new Intent(NewPostActivity.this,MainActivity.class);
startActivity(mainPage);
finish();
}
else
{
Toast.makeText(NewPostActivity.this,"Error Occurred",Toast.LENGTH_SHORT).show();
}
}
});
}
else
{
Toast.makeText(NewPostActivity.this,"Error in posting",Toast.LENGTH_SHORT).show();
}
// firestore.collection("Posts").document().update("TimeStamp",FieldValue.serverTimestamp());
}
});
}
}
I use a NewPostActivity to post the data in firebase Firestore by creating a collections and retrieving the data in recycler view format as usual, but whenever I retrieve data from firebase and add it to arraylist and display in recyclerView it only shows the newly added element at first and then when I switch to another fragment and come back to homeFragment it shows all the post neatly. I tried finding solutions on youtube but couldn't find any.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
