2016-04-26 110 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

感谢您的帮助顺便说一句, 之前,但我有一个诺特尔问题,当第一次点击的片段数据将加载,但是当第二次点击在数据已经加载的同一个片段,因此不需要再次加载数据,你能帮忙吗? –