2016-04-26 107 views
1

我有2個片段(片段A和片段B),帶有使用.json加載數據的函數。如果數據已經加載,停止從.json加載數據

當我點擊片段A時,數據會加載,當我點擊片段B時,數據也會加載。

當我再次單擊片段A時,數據將被重新加載並複製(附加第一次單擊的數據)。

如何在數據已經加載時停止加載數據?

例如圖像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

清除您的fragment_b的fragment_b裏面onResponse –

回答

4

只是包裝你的movieRequest

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

但請記住,這種方法如果是在服務器上改變你的數據將不會更新,使它可更新,你必須每次填充它,而不是之前清除movieList

movieList.clear(); 
+0

其中我把movieList.clear(); –

+0

你可以把它裏面onRequest或創建JsonArray之前,只是做它,你將數據添加到列表 –

+0

感謝您的幫助順便說一句, 之前,但我有一個諾特爾問題,當第一次點擊的片段數據將加載,但是當第二次點擊在數據已經加載的同一個片段,因此不需要再次加載數據,你能幫忙嗎? –