简体   繁体   中英

how to refresh recyclerView's data which is being fetched froman API

I'm developing an API whose data are being fetched from an api and the main parent layout is set to SwipeRefreshLayout which on swiped refreshes the data of the API(that is what it is suppose to do). But what's happening is everytime I try to refresh new refreshed data are being called in the end of the existing recyclerview's data and the recycler view gets longer and longer with new data in the end (if I keep refreshing).

Here's the xml code...

<?xml version="1.0" encoding="utf-8"?>
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/mainLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_centerInParent="true"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    tools:context=".StateReportActivity">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="324dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:padding="20dp" />

</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>

And this is the java code...

package com.example.iii;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;

import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.SearchView;

import android.widget.Toast;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;

public class StateReportActivity extends AppCompatActivity {

    final String REPORT_URL = "// url";

    ArrayList<Item> itemArrayList;
    RecyclerView recyclerView;
    CustomAdapter adapter;

    SwipeRefreshLayout refreshLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_state_report);
        View mainLayout = findViewById(R.id.mainLayout);
        Drawable drawable = mainLayout.getBackground();
        drawable.setAlpha(20);

        refreshLayout = findViewById(R.id.mainLayout);

        refreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                refreshLayout.setRefreshing(false);
                loadStateReport();  // here I'm calling the method again
            }
        });

        itemArrayList = new ArrayList<>();
        loadStateReport();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.search_filter_menu, menu);

        MenuItem searchItem = menu.findItem(R.id.search_item);
        SearchView searchView = (SearchView) searchItem.getActionView();

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                adapter.getFilter().filter(newText);
                return false;
            }
        });
        return true;
    }


    public void loadStateReport () {
        Log.d ("debugging", "entered the loadSateReport() Fn.");
        RequestQueue requestQueue = Volley.newRequestQueue(StateReportActivity.this);
        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, REPORT_URL, null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        try {
                            JSONArray array = response.getJSONArray("regionData");

                            for (int i = 0; i < array.length(); i++) {
                                JSONObject object = array.getJSONObject(i);

                                String region = object.getString("region");
                                Long activeCases = object.getLong("activeCases");
                                Long newInfected = object.getLong("newInfected");
                                Long recovered = object.getLong("recovered");
                                Long newRecovered = object.getLong("newRecovered");
                                Long deceased = object.getLong("deceased");
                                Long newDeceased = object.getLong("newDeceased");
                                Long total = object.getLong("totalInfected");

                                itemArrayList.add(new Item(region, activeCases, newInfected, recovered, newRecovered, deceased,
                                        newDeceased, total));
                            }

                            recyclerView = findViewById(R.id.recyclerView);
                            recyclerView.setLayoutManager(new LinearLayoutManager(StateReportActivity.this));
                            adapter = new CustomAdapter(StateReportActivity.this, itemArrayList);
                            recyclerView.setAdapter(adapter);

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(StateReportActivity.this, "Network error!", Toast.LENGTH_SHORT).show();
            }
        });
        requestQueue.add(jsonObjectRequest);
        Log.d("debugging", "ObjectRequest added to the queue.");
    }
}

What I want is, the existing data should be refreshed and not appending the data in the end.

Any help would be really appreciated.

This is happening because you have itemArrayList which is declared as global and you are keep on adding data into it whenever you are getting response. You can fix this issue by just clearing existing item from this list and adding item fresh. Here:

itemArrayList.clear()
itemArrayList.add(new Item(region, activeCases, newInfected, recovered, newRecovered, deceased, newDeceased, total));

That should fix your issue.

Suggestion: Move all your business logic in ViewModel from Activity. This code looks ugly.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM