【发布时间】: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