【问题标题】:how to refresh recyclerView's data which is being fetched froman API如何刷新从 API 获取的 recyclerView 数据
【发布时间】:2021-08-25 03:49:46
【问题描述】:

我正在开发一个 API,它的数据是从一个 api 获取的,并且主父布局设置为 SwipeRefreshLayout,它在刷卡时会刷新 API 的数据(这是它应该做的)。但是发生的情况是,每次我尝试刷新新的刷新数据时,都会在现有 recyclerview 数据的末尾调用,并且最终使用新数据(如果我继续刷新),recycler 视图会变得越来越长。

这是 xml 代码...

<?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>

这是java代码...

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

我想要的是,应该刷新现有数据而不是最后附加数据。

任何帮助将不胜感激。

【问题讨论】:

    标签: java android android-recyclerview


    【解决方案1】:

    发生这种情况是因为您拥有声明为全局的 itemArrayList,并且每当您收到响应时,您都会继续向其中添加数据。您只需从此列表中清除现有项目并添加新项目即可解决此问题。 这里:

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

    这应该可以解决您的问题。

    建议:将 ViewModel 中的所有业务逻辑从 Activity 中移出。这段代码看起来很难看。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-20
      • 1970-01-01
      • 2021-10-03
      • 1970-01-01
      • 2020-03-18
      • 1970-01-01
      • 2021-11-28
      相关资源
      最近更新 更多