I am trying to fetch data from my Parse database and display it into my RecyclerView. Upon entering the Fragment, the RecyclerView displays no data. It isn't until I Swipe Refresh the feed that the items are accurately displayed in the RecyclerView. How can I make the RecyclerView have the items already initialized upon entering the Fragment?
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
placeName = view.findViewById(R.id.profileEstablishmentName);
placeAddress = view.findViewById(R.id.restroomAddressInfo);
placeRating = view.findViewById(R.id.ratingBar);
rvFeed = view.findViewById(R.id.rvRestaurant);
swipeContainer = view.findViewById(R.id.swipeContainer);
swipeContainer.setColorSchemeResources(android.R.color.holo_blue_bright,
android.R.color.holo_green_light,
android.R.color.holo_orange_light,
android.R.color.holo_red_light);
swipeContainer.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() { queryPosts(); }
});
allPosts = new ArrayList<>();
adapter = new PostsAdapter(getContext(), allPosts);
rvFeed.setAdapter(adapter);
rvFeed.setLayoutManager(new LinearLayoutManager(getContext()));
queryPosts();
setHasOptionsMenu(true);
}
Parse Query:
protected void queryPosts(){
ParseQuery<Post> query = ParseQuery.getQuery(Post.class);
query.include(Post.KEY_USER);
query.include(Post.KEY_PLACE_NAME);
//Constraint to only see posts of the selected Restaurant
query.whereEqualTo(Post.KEY_PLACE_NAME, placeName.getText().toString());
query.setLimit(20);
//Filters the order of the posts based on the time created key (newest on top)
query.addDescendingOrder(Post.KEY_CREATED_KEY);
query.findInBackground(new FindCallback<Post>() {
@Override
public void done(List<Post> posts, ParseException e) {
if (e != null) {
Log.e(TAG, "Issue with getting posts", e);
return;
}
for(Post post : posts){
Log.i(TAG, "Post: " + post.getPlaceName());
}
adapter.clear();
allPosts.addAll(posts);
adapter.notifyDataSetChanged();
swipeContainer.setRefreshing(false);
}
});
}
PostAdapter:
public class PostsAdapter extends RecyclerView.Adapter<PostsAdapter.ViewHolder>{
private Context context;
private List<Post> posts;
public PostsAdapter(Context context, List<Post> posts){
this.context = context;
this.posts = posts;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.item_post, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Post post = posts.get(position);
holder.bind(post);
}
@Override
public int getItemCount() {
return posts.size();
}
public void clear() {
posts.clear();
notifyDataSetChanged();
}
// Add a list of items -- change to type used
public void addAll(List<Post> list) {
posts.addAll(list);
notifyDataSetChanged();
}
class ViewHolder extends RecyclerView.ViewHolder{
private TextView tvUsername;
private TextView tvDescription;
private TextView tvPlaceName;
private ImageView ivImage;
public ViewHolder(@NonNull View itemView) {
super(itemView);
tvUsername = itemView.findViewById(R.id.username);
tvPlaceName = itemView.findViewById(R.id.placeName);
tvDescription = itemView.findViewById(R.id.reviewDescription);
ivImage = itemView.findViewById(R.id.ivImage);
}
public void bind(Post post) {
//Bind the post data to the view elements
tvDescription.setText(post.getDescription());
tvUsername.setText("@" + post.getUser().getUsername());
tvPlaceName.setText(post.getPlaceName());
ParseFile image = post.getImage();
if (image != null) {
Glide.with(context).load(post.getImage().getUrl()).into(ivImage);
}
}
}