Optimizing RecyclerView Showing Items in Android, Java: Handling Dataset Extraction

31 views Asked by At

The problem is when I navigate from NewsSeeAllFragment to NewDetailsFragment and then I go back to NewsSeeAllFragment, the newsSeeAllAdapter tries to show all the items that has been extracted from the extractNextNews method which is called when the user scrolls down to the bottom of the recyclerview. The extractNextNews is getting the next 10 news from the request. But when I scroll and I extract lets say 50 news, when I am going from NewsSeeAllFragment to NewDetailsFragment and then I go back to NewsSeeAllFragment the adapter tries to show all the 50 news and this takes 3-4 seconds and it is annoying. Can I solve this problem?

The extractnextNews() is called on the NewsSeeAllFragment inside the onCreateView():

        if (InternetConnection.isConnectedToInternet(getContext())) {
        if (nestedScrollView != null) {
            nestedScrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
                @Override
                public void onScrollChanged() {

                    View view = (View) nestedScrollView.getChildAt(nestedScrollView.getChildCount() - 1);

                    int diff = (view.getBottom() - (nestedScrollView.getHeight() + nestedScrollView
                            .getScrollY()));

                    if (diff == 0) {
                        if (nextNewURL != null) {
                            progressBar.setVisibility(View.VISIBLE);
                            extractNextNews(nextNewURL);
                        }
                    }
                }
            });
            progressBar.setVisibility(View.GONE);
        }
}

On my NewsSeeAllFragment class I am using this inside the onCreateView() method:

    LinearLayoutManager newsSeeAllLayoutManager =
            new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);
    newsSeeAllRecyclerView.setLayoutManager(newsSeeAllLayoutManager);

    newsSeeAllAdapter = new NewsSeeAllAdapter(newsList);
    newsSeeAllRecyclerView.setAdapter(newsSeeAllAdapter);

Here is the extractNextNews method:

public void extractNextNews(String URL) {
    if (getActivity() != null) {
        RequestQueue queue = Volley.newRequestQueue(getActivity());
        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, URL, null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                try {
                    JSONObject jsonObject = new JSONObject(response.toString());
                    //get next value
                    String nextNewAPI = jsonObject.getString("next");
                    //get results array
                    JSONArray resultsArray = jsonObject.getJSONArray("results");

                    for (int i = 0; i < resultsArray.length(); i++) {
                        New n = new New();
                        JSONObject jsonObjectResults = resultsArray.getJSONObject(i);
                        String title = jsonObjectResults.getString("websitetitle");
                        String image = jsonObjectResults.getString("websiteimage");
                        String date = jsonObjectResults.getString("websitereleasedate");
                        String content = jsonObjectResults.getString("websitecontent");

                        //replace unwanted characters
                        title = HtmlCompat.fromHtml(title, HtmlCompat.FROM_HTML_MODE_LEGACY).toString();

                        n.setTitle(title);
                        n.setImage(image);
                        n.setDate(date);
                        n.setContent(content);
                        n.setNextNew(nextNewAPI);

                        nextNewURL = n.getNextNew();
                        newsList.add(n);

                        newsSeeAllAdapter.notifyItemInserted(newsList.size() - 1);
                    }
                    Services.getInstance().setNewsList(newsList);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.d("NewsJSONRequestError", String.valueOf(error));
            }
        });
        queue.add(jsonObjectRequest);
    }
}

Here is my NewsSeeAllAdapter class:

public class NewsSeeAllAdapter extends RecyclerView.Adapter<NewsSeeAllAdapter.ViewHolder> {
List<New> allNewsList;
private LinearLayoutManager layoutManager;

public NewsSeeAllAdapter(List<New> allNewsList) {
    this.allNewsList = allNewsList;
}


@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.news_see_all_listview, parent, false);
    return new ViewHolder(v);
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {

    Log.d("positionIndex ", position + "");

    holder.newTitle.setText(allNewsList.get(holder.getAdapterPosition()).getTitle());

    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
    Date convertedDate = new Date();
    try {
        convertedDate = dateFormat.parse(allNewsList.get(holder.getAdapterPosition()).getDate());
        SimpleDateFormat newFormatDate = new SimpleDateFormat("dd/MM/yyyy");
        String finalDateString = newFormatDate.format(convertedDate);
        holder.newDate.setText(finalDateString);
    } catch (ParseException e) {
        e.printStackTrace();
    }

    if (allNewsList.get(holder.getAdapterPosition()).getImage().isEmpty()) {
        Picasso.get().cancelRequest(holder.newImage);
        holder.newImage.setImageResource(R.drawable.example);
        holder.newImage.setScaleType(ImageView.ScaleType.FIT_CENTER);
    } else {
        Picasso.get().load(allNewsList.get(holder.getAdapterPosition()).getImage()).into(holder.newImage);
    }


    holder.view.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            Bundle bundle = new Bundle();
            AppCompatActivity activity = (AppCompatActivity) holder.view.getContext();

            bundle.putSerializable("newsList", (Serializable) allNewsList);
            activity.getIntent().putExtra("title", allNewsList.get(holder.getAdapterPosition()).getTitle());
            activity.getIntent().putExtra("content", allNewsList.get(holder.getAdapterPosition()).getContent());
            activity.getIntent().putExtra("date", allNewsList.get(holder.getAdapterPosition()).getDate());
            activity.getIntent().putExtra("image", allNewsList.get(holder.getAdapterPosition()).getImage());
            activity.getIntent().putExtra("next", allNewsList.get(holder.getAdapterPosition()).getNextNew());

            NavController navController = Navigation.findNavController((Activity) view.getContext(), R.id.nav_host_fragment);
            navController.navigate(R.id.newDetailsFragment);
        }
    });
}

@Override
public int getItemCount() {
    return allNewsList.size();
}

public class ViewHolder extends RecyclerView.ViewHolder {
    TextView newTitle, newSubtitle, newDate;
    ImageView newImage;
    View view;

    public ViewHolder(@NonNull View itemView) {
        super(itemView);
        view = itemView;
        newTitle = itemView.findViewById(R.id.news_see_all_title);
        newImage = itemView.findViewById(R.id.news_see_all_ImageView);
        newDate = itemView.findViewById(R.id.news_see_all_date);
    }
}

}

0

There are 0 answers