2017-09-24 194 views
0

任何人都可以请帮助我我无法弄清代码中的问题。我只想在应用程序启动或活动重新加载时加载一次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

在向其添加项目之前清除ArrayList androidVersions.clear() 并没有使用adapter.notifyDataSetChanged(),因此您可以将其删除。 –

+0

非常感谢你Geeta它像魅力一样工作。 – Adam

回答

0

你的代码是正确的,但绝不能有重复的数据,请尝试删除数据

+0

rajendra你正在写关于删除数据的捕获,我尝试它的工作原理,但我想在应用程序启动时在recylerview中存储至少少量的数据,以便用户可以查看或读取离线时最近成功加载的数据的一些,只要互联网连接不可用,那么我应该怎么做呢? – Adam

0

在你onResponse你不是正在打扫androidVersions列表的缓存。因此,每次执行请求时,都会向列表中添加新项目。很可能你的请求被执行两次(loadRecyclerViewData()被调用两次?)。

每次填入onResponse时,请尝试清理或重新创建androidVersions

+0

感谢algrid为您的解决方案,但你能解释我说你详细说什么像一块程序来清除列表,因为我第一次做这件事 – Adam

+0

请告诉我应该如何实现你所说的编程? – Adam

相关问题