2016-04-26 3 views
1

У меня есть 2 фрагмента (фрагмент A и фрагмент B) с функциями для загрузки данных с использованием .json.Стоп Загрузка данных из .json, если при загрузке данных

Когда я нажимаю фрагмент A, данные загружаются, и когда я нажимаю фрагмент B, данные будут загружаться тоже.

Когда я нажимаю фрагмент В другое время данные перезагружаются и дублируются (добавляются с данными с первого щелчка).

Как остановить загрузку данных, если данные уже загружены?

пример изображения duplicate здесь мой фрагмент кода

fragment_a.java

public class fragment_a extends Fragment { 
    // Log tag 
    private static final String TAG = MovieFragment1.class.getSimpleName(); 

    // Movies json url 
    private static final String url = "http://......."; 
    private ProgressDialog pDialog; 
    private List<Movie> movieList = new ArrayList<Movie>(); 
    private ListView listView; 
    private CustomListAdapter adapter; 

    public MovieFragment1() { 
     // Required empty public constructor 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     hidePDialog(); 
    } 

    private void hidePDialog() { 
     if (pDialog != null) { 
      pDialog.dismiss(); 
      pDialog = null; 
     } 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.activity_list, container, false); 
     // Inflate the layout for this fragment 

     final ListView listView = (ListView) rootView.findViewById(R.id.list); 
     adapter = new CustomListAdapter(getActivity(), movieList); 
     listView.setAdapter(adapter); 

     pDialog = new ProgressDialog(getActivity()); 
     // Showing progress dialog before making http request 
     pDialog.setMessage("Loading..."); 
     pDialog.show(); 


     // Creating volley request obj 
     JsonArrayRequest movieReq = new JsonArrayRequest(url, 
       new Response.Listener<JSONArray>() { 
        @Override 
        public void onResponse(JSONArray response) { 
         Log.d(TAG, response.toString()); 
         hidePDialog(); 

         // Parsing json 
         for (int i = 0; i < response.length(); i++) { 
          try { 

           JSONObject obj = response.getJSONObject(i); 
           Movie movie = new Movie(); 
           if (obj.getString("tipe").equals("chest")){ 
           movie.setTitle(obj.getString("name")); 
           movie.setThumbnailUrl(obj.getString("images1")); 
           //movie.setDescribe(obj.getString("describe")); 
           //movie.setRating(((Number) obj.get("rating")) 
           //  .doubleValue()); 
           movie.setYear(obj.getInt("id")); 
           movie.setTipe(obj.getString("tipe")); 

           /*// Genre is json array 
           JSONArray genreArry = obj.getJSONArray("genre"); 
           ArrayList<String> genre = new ArrayList<String>(); 
           for (int j = 0; j < genreArry.length(); j++) { 
            genre.add((String) genreArry.get(j)); 
           } 
           movie.setGenre(genre);*/ 

           // adding movie to movies array 
           movieList.add(movie); 
          } 
          } catch (JSONException e) { 
           e.printStackTrace(); 
          } 

         } 

         // notifying list adapter about data changes 
         // so that it renders the list view with updated data 
         adapter.notifyDataSetChanged(); 
        } 
       }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       VolleyLog.d(TAG, "Error: " + error.getMessage()); 
       hidePDialog(); 

      } 
     }); 

     // Adding request to request queue 
     AppController.getInstance().addToRequestQueue(movieReq); 

     return rootView; 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
    } 
} 

fragment_b.java

public class fragment_b extends Fragment { 
    // Log tag 
    private static final String TAG = MovieFragment1.class.getSimpleName(); 

    // Movies json url 
    private static final String url = "http://......"; 
    private ProgressDialog pDialog; 
    private List<Movie> movieList = new ArrayList<Movie>(); 
    private ListView listView; 
    private CustomListAdapter adapter; 

    public MovieFragment1() { 
     // Required empty public constructor 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     hidePDialog(); 
    } 

    private void hidePDialog() { 
     if (pDialog != null) { 
      pDialog.dismiss(); 
      pDialog = null; 
     } 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.activity_list, container, false); 
     // Inflate the layout for this fragment 

     final ListView listView = (ListView) rootView.findViewById(R.id.list); 
     adapter = new CustomListAdapter(getActivity(), movieList); 
     listView.setAdapter(adapter); 

     pDialog = new ProgressDialog(getActivity()); 
     // Showing progress dialog before making http request 
     pDialog.setMessage("Loading..."); 
     pDialog.show(); 


     // Creating volley request obj 
     JsonArrayRequest movieReq = new JsonArrayRequest(url, 
       new Response.Listener<JSONArray>() { 
        @Override 
        public void onResponse(JSONArray response) { 
         Log.d(TAG, response.toString()); 
         hidePDialog(); 

         // Parsing json 
         for (int i = 0; i < response.length(); i++) { 
          try { 

           JSONObject obj = response.getJSONObject(i); 
           Movie movie = new Movie(); 
           if (obj.getString("tipe").equals("forearm")){ 
           movie.setTitle(obj.getString("name")); 
           movie.setThumbnailUrl(obj.getString("images1")); 
           //movie.setDescribe(obj.getString("describe")); 
           //movie.setRating(((Number) obj.get("rating")) 
           //  .doubleValue()); 
           movie.setYear(obj.getInt("id")); 
           movie.setTipe(obj.getString("tipe")); 

           /*// Genre is json array 
           JSONArray genreArry = obj.getJSONArray("genre"); 
           ArrayList<String> genre = new ArrayList<String>(); 
           for (int j = 0; j < genreArry.length(); j++) { 
            genre.add((String) genreArry.get(j)); 
           } 
           movie.setGenre(genre);*/ 

           // adding movie to movies array 
           movieList.add(movie); 
          } 
          } catch (JSONException e) { 
           e.printStackTrace(); 
          } 

         } 

         // notifying list adapter about data changes 
         // so that it renders the list view with updated data 
         adapter.notifyDataSetChanged(); 
        } 
       }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       VolleyLog.d(TAG, "Error: " + error.getMessage()); 
       hidePDialog(); 

      } 
     }); 

     // Adding request to request queue 
     AppController.getInstance().addToRequestQueue(movieReq); 

     return rootView; 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
    } 
} 

tabfragment.java (фрагмент адаптер)

public class TabFragment extends Fragment { 

    public static TabLayout tabLayout; 
    public static ViewPager viewPager; 
    public static int int_items = 3 ; 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     /** 
     *Inflate tab_layout and setup Views. 
     */ 
     View x = inflater.inflate(R.layout.tab_layout,null); 
     tabLayout = (TabLayout) x.findViewById(R.id.tabs); 
     viewPager = (ViewPager) x.findViewById(R.id.viewpager); 

     /** 
     *Set an Apater for the View Pager 
     */ 
     viewPager.setAdapter(new MyAdapter(getChildFragmentManager())); 

     /** 
     * Now , this is a workaround , 
     * The setupWithViewPager dose't works without the runnable . 
     * Maybe a Support Library Bug . 
     */ 

     tabLayout.post(new Runnable() { 
      @Override 
      public void run() { 
       tabLayout.setupWithViewPager(viewPager); 
      } 
     }); 

     return x; 

    } 

    class MyAdapter extends FragmentPagerAdapter{ 

     public MyAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     /** 
     * Return fragment with respect to Position . 
     */ 

     @Override 
     public Fragment getItem(int position) 
     { 
      switch (position){ 
       case 0 : return new fragment_a(); 
       case 1 : return new HomeFragment(); 
       case 2 : return new fragment_b(); 
      } 
      return null; 
     } 

     @Override 
     public int getCount() { 

      return int_items; 

     } 

     /** 
     * This method returns the title of the tab according to the position. 
     */ 

     @Override 
     public CharSequence getPageTitle(int position) { 

      switch (position){ 
       case 0 : 
        return "Chest"; 
       case 1 : 
        return "Movie"; 
       case 2 : 
        return "Forearm"; 
      } 
      return null; 
     } 
    } 

} 
+0

Где вы храните данные. На уровне активности или уровне фрагмента. Если вы сохраняете на уровне активности, тогда будет достаточно простой нулевой проверки. – nilkash

+0

@nilkash сохранение данных на moviefragment.javathen его фрагмент, можете ли вы привести пример? –

+1

Очистить свой фильмList от фрагмента_b внутри onResponse –

ответ

4

Просто обернуть movieRequest с

if(movieList.isEmpty()){ 
    JsonArrayRequest movieReq = new JsonArrayRequest(url, ... ETC... 
    // etc 
} 

Но помните, что при таком подходе ваши данные не будут обновляться, если он изменяется на сервере, чтобы сделать его обновляемым вы должны очистить movieList перед заполнением его каждый раз, вместо того, чтобы:

movieList.clear(); 
+0

, где я устанавливаю movieList.clear(); –

+0

Вы можете поместить его внутри onRequest или перед созданием JsonArray, просто сделайте это, прежде чем добавлять данные в список –

+0

. Спасибо за вашу помощь. Btw, , но у меня есть более серьезная проблема при загрузке данных первого щелчка, но при втором щелчке тот же самый фрагмент, когда данные уже загружаются, поэтому нет необходимости загружать данные снова, можете ли вы помочь в этом? –

Смежные вопросы