2016-09-12 1 views
1

J'utilise pull pour actualiser dans mon fragment pour actualiser les données récupérées via une URL json. Mais le problème auquel je suis confronté est que, dès que j'attermine sur une page de fragment, le widget de rafraîchissement commence et les données commencent à se charger, mais si je récupère les données sur Internet, je glisse mon viewpager sur une nouvelle page. et puis immédiatement à la page précédente où les données étaient en charge, puis un nouveau widget Swipe Refresh vient sur le widget précédemment existant, d'où il y a deux widgets qui se chevauchent et un widget reste toujours sur l'écran même si les données sont chargées. utilisé setRefrshing (false) mais il ne fonctionne pas selon mes besoins.Quelques problèmes concernant l'implémentation de Pull to Refresh à l'aide de SwipeRefreshLayout

Fragment.java

public class Africa extends Fragment implements SwipeRefreshLayout.OnRefreshListener{ 

    //ProgressDialog pDialog; 
    private RecyclerView mRecyclerView; 
    //private RecyclerView.Adapter mAdapter; 
    private RecyclerView.LayoutManager mLayoutManager; 
    private CountryDataAdapter adapter; 
    private ArrayList<CountriesData> data; 
    private SwipeRefreshLayout swipe; 
    EasyTracker easyTracker; 

    public Africa(){ 

    } 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setHasOptionsMenu(true); 
     easyTracker = EasyTracker.getInstance(getActivity()); 
     // setContentView(R.layout.countrydata); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     //pDialog = new ProgressDialog(this.getContext(), ProgressDialog.THEME_HOLO_LIGHT); 
     View v = inflater.inflate(R.layout.countrydata, container, false); 

     //mRecyclerView = (RecyclerView) v.findViewById(R.id.my_recycler_view1); 
     mRecyclerView = (RecyclerView)v.findViewById(R.id.my_recycler_view1); 
     mRecyclerView.setHasFixedSize(true); 
     adapter=new CountryDataAdapter(getActivity()); 
     mLayoutManager = new LinearLayoutManager(getContext()); 
     mRecyclerView.setLayoutManager(mLayoutManager); 
     // loadJSON(); 

     swipe=(SwipeRefreshLayout)v.findViewById(R.id.swipe_refresh_layout); 
     swipe.setOnRefreshListener(this); 
     swipe.setColorSchemeColors(R.color.b, R.color.p, R.color.g, R.color.o); 
     // loadRetro(); 
     final boolean ref=swipe.isRefreshing(); 
     if(ref) loadRetro(); 
     else 
     { 
      swipe.postDelayed(new Runnable() { 
       @Override 
       public void run() { 

         swipe.setRefreshing(true); 
         loadRetro(); 
        easyTracker.send(MapBuilder.createEvent("Home Page", "Swipe", "Africa", null).build()); 
       } 
      }, 500); 
     } 

     return v; 
    } 

    private boolean isNetworkAvailable() { 
     ConnectivityManager connectivityManager 
       = (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); 
     return activeNetworkInfo != null && activeNetworkInfo.isConnected(); 
    } 

    @Override 
    public void onCreateOptionsMenu(
      Menu menu, MenuInflater inflater) { 
     inflater.inflate(R.menu.main, menu); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_refresh) { 
      boolean x=isNetworkAvailable(); 
      if(x) 
      { 

       swipe.setRefreshing(true); 
       loadRetro(); 
       easyTracker.send(MapBuilder.createEvent("Home Page", "Refresh", "Africa", null).build()); 
       return true; 
      } 
      else Toast.makeText(getActivity(), "No Internet Connection!", 
        Toast.LENGTH_SHORT).show(); 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

    @Override 
    public void onRefresh(){ 
//  swipe.setRefreshing(true); 
//  loadRetro(); 
     if(!swipe.isRefreshing()) { 
      swipe.postDelayed(new Runnable() { 

       @Override 
       public void run() { 
        swipe.setRefreshing(true); 
        loadRetro(); 
       } 
      }, 1500); 
     } 
     else loadRetro(); 
     easyTracker.send(MapBuilder.createEvent("Home Page", "Pull To Refresh", "Africa", null).build()); 
//  pDialog.dismiss(); 

    } 


    public void loadRetro(){ 

     // swipe.setRefreshing(true); 
//  pDialog.setMessage("Please wait..."); 
//  pDialog.setCancelable(false); 
//  pDialog.show(); 
     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl("http://www.appuonline.com") 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 
     jsonrequest request = retrofit.create(jsonrequest.class); 
     Call<JsonResponse> call = request.getJSON5(); 
     call.enqueue(new Callback<JsonResponse>() { 
      @Override 
      public void onResponse(Call<JsonResponse> call, Response<JsonResponse> response) { 
       try{ 
        JsonResponse jsonResponse = response.body(); 
        data = new ArrayList<>(Arrays.asList(jsonResponse.getData())); 
        adapter.addItems(data); 
        mRecyclerView.setAdapter(adapter); 
//     if (pDialog.isShowing()) 
//      pDialog.dismiss(); 
        swipe.setRefreshing(false);} 
       catch (Exception e){ 
        e.printStackTrace(); 
       } 
      } 

      @Override 
      public void onFailure(Call<JsonResponse> call, Throwable t) { 
       try{ 
        Log.d("Error", "no connection"); 
        swipe.setRefreshing(false);} 
       catch (Exception e){ 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

} 

Répondre

1

ensemble limite de décalage à votre ViewPager.

exemple:

pager.setOffscreenPageLimit(5); //5 is count of pages in viewpager 
+0

Que fera cette commande? –

+0

cela ne recyclera pas le fragment précédent. – LearnPainLess

+0

ce qui signifie que votre ancien fragment restera tel quel. (ne pas recharger à nouveau) – LearnPainLess

1

pour votre deuxième question:

créer une classe de service Android. et utilisez CountDownTimer classer ce service. Dans la méthode onStartCommand() de Service, il suffit d'initialiser CountDownTimer.

@Override 
    public int onStartCommand(final Intent intent, int flags, int startId) { 

     mCountDownTimer = new CountDownTimer(5000, 1000) { 
      @Override 
      public void onTick(long millisUnitFinished) { 
      } 

      @Override 
      public void onFinish() { 
       //you will get status every 5 second here. 
      } 
     }; 
     mCountDownTimer.start(); 

     return START_NOT_STICKY; 
    } 
+0

J'ai réussi à définir une minuterie en utilisant un nouveau thread également. –

+0

mais le nouveau thread fonctionnera jusqu'à ce que vous utilisiez votre application. cela ne fonctionnera pas en mode d'arrière-plan. – LearnPainLess

+0

Donc, c'est ce que je voulais, je voulais mettre à jour mes données quand j'utilisais mon application .et encore quand je redémarre mon application, les données seront automatiquement actualisées et mises à jour. –