json数据在重新加载应用程序或打开应用程序时在recylerview中重复两次
问题描述:
任何人都可以请帮助我我无法弄清代码中的问题。我只想在应用程序启动或活动重新加载时加载一次json响应,但每次在应用程序启动时都会在recylerview中加载json响应两次,并且在我的情况下从服务器获取两个副本,然后在recylerview中共有50个新闻频道25新闻频道json数据在重新加载应用程序或打开应用程序时在recylerview中重复两次
public class General extends Fragment
{
private static final String
URL = "https://newsapi.org/v1/sources?language=en&category=general&apiKey=0e1b2f7bc6bd4e1fbe0b40bea257dc97";
private final int android_image_urls[] =
{
R.drawable.abcnews,
R.drawable.aljazeera,
R.drawable.associatedpress,
R.drawable.bbcnews,
R.drawable.cnn,
R.drawable.googlenews,
R.drawable.independent,
R.drawable.metro,
R.drawable.mirror,
R.drawable.newsweek,
R.drawable.newyorkmagazine,
R.drawable.reddit,
R.drawable.reuters,
R.drawable.theguardianau,
R.drawable.theguardianuk,
R.drawable.thehindu,
R.drawable.thehuffingtonpost,
R.drawable.thenewyorktimes,
R.drawable.thetelegraph,
R.drawable.thetimesofindia,
R.drawable.thewashingtonpost,
R.drawable.time,
R.drawable.usatoday
};
private RecyclerView recyclerView;
private RecyclerView.Adapter adapter;
private ArrayList<AndroidVersion> androidVersions;
TextView textView;
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.layout_general, container, false);
recyclerView = (RecyclerView) rootView.findViewById(R.id.card_recycler_view);
recyclerView.setHasFixedSize(true);
RecyclerView.LayoutManager layoutManager = new GridLayoutManager(getContext(),3);
recyclerView.setLayoutManager(layoutManager);
textView = (TextView) rootView.findViewById(R.id.empty_view);
androidVersions = new ArrayList<>();
loadRecyclerViewData();
return rootView;
}
public void loadRecyclerViewData() {
final ProgressDialog progressDialog = new ProgressDialog(getContext());
progressDialog.setMessage("Loading Data....");
progressDialog.show();
JsonObjectRequest data = new JsonObjectRequest(Request.Method.GET, URL,null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
progressDialog.dismiss();
try {
JSONObject jsonObject = new JSONObject(String.valueOf(response));
JSONArray array = jsonObject.getJSONArray("sources");
for (int i = 0; i < array.length(); i++) {
JSONObject o = array.getJSONObject(i);
AndroidVersion item = new AndroidVersion(
o.getString("name"),
android_image_urls[i],
o.getString("category")
);
androidVersions.add(item);
}
if (androidVersions.isEmpty()) {
recyclerView.setVisibility(View.GONE);
textView.setVisibility(View.VISIBLE);
} else {
recyclerView.setVisibility(View.VISIBLE);
textView.setVisibility(View.GONE);
}
adapter = new DataAdapter(androidVersions, getContext());
recyclerView.setAdapter(adapter);
adapter.notifyDataSetChanged();
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
progressDialog.dismiss();
Toast.makeText(getContext(),"No Internet Connection", Toast.LENGTH_SHORT).show();
}
})
{
@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
try {
Cache.Entry cacheEntry = HttpHeaderParser.parseCacheHeaders(response);
if (cacheEntry == null) {
cacheEntry = new Cache.Entry();
}
final long cacheHitButRefreshed = 3 * 60*1000; // in 3 minutes cache will be hit, but also refreshed on background
final long cacheExpired = 24 * 60 * 1000 ; //24 * 60 * 60 * 1000; // in 24 hours this cache entry expires completely
long now = System.currentTimeMillis();
final long softExpire = now + cacheHitButRefreshed;
final long ttl = now + cacheExpired;
cacheEntry.data = response.data;
cacheEntry.softTtl = softExpire;
cacheEntry.ttl = ttl;
String headerValue;
headerValue = response.headers.get("Date");
if (headerValue != null) {
cacheEntry.serverDate = HttpHeaderParser.parseDateAsEpoch(headerValue);
}
headerValue = response.headers.get("Last-Modified");
if (headerValue != null)
{
cacheEntry.lastModified = HttpHeaderParser.parseDateAsEpoch(headerValue);
}
cacheEntry.responseHeaders = response.headers;
final String jsonString = new String(response.data,
HttpHeaderParser.parseCharset(response.headers));
return Response.success(new JSONObject(jsonString), cacheEntry);
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (JSONException e) {
return Response.error(new ParseError(e));
}
}
@Override
protected void deliverResponse(JSONObject response) {
super.deliverResponse(response);
}
@Override
public void deliverError(VolleyError error) {
super.deliverError(error);
}
@Override
protected VolleyError parseNetworkError(VolleyError volleyError) {
return super.parseNetworkError(volleyError);
}
};
RequestQueue requestQueue = Volley.newRequestQueue(getContext());
requestQueue.add(data);
}
}
答
你的代码是正确的,但绝不能有重复的数据,请尝试删除数据
+0
rajendra你正在写关于删除数据的捕获,我尝试它的工作原理,但我想在应用程序启动时在recylerview中存储至少少量的数据,以便用户可以查看或读取离线时最近成功加载的数据的一些,只要互联网连接不可用,那么我应该怎么做呢? – Adam
在向其添加项目之前清除ArrayList androidVersions.clear() 并没有使用adapter.notifyDataSetChanged(),因此您可以将其删除。 –
非常感谢你Geeta它像魅力一样工作。 – Adam