0

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);
        }
    }
}

0 Answers0