2015-11-02 1 views
1

Dans mon projet je navigue entre les fragments android dans l'un de ces fragments, il y a une liste qui reçoit des informations d'un json. Il est devenu nécessaire de mettre à jour cette liste toutes les 1 minute, je les utiliseDétruire le fragment précédent dans android

postDelayed (this, 60000); 

appeler un fil, qui utilise changeActivity (ActivitiesListFragment.class, null); pour actualiser la liste.

En cours d'exécution, la liste est mise à jour dans un nouveau fragment.

Le problème est que lorsque j'appuie sur le bouton retour, il revient à la liste précédente, car il n'a pas été "détruit". Comment démarrer un nouveau fragment et supprimer le fragment précédent?

Merci!

public class ActivitiesListFragment extends AbstractListFragment { 
private AbstractNetworkHandler handler; 
private ListView    listView; 
private ActivitiesListAdapter adapter; 

private long     currentPage = 0L; 
private int     pageSize  = 50; 
private int     previousTotal = 0; 
private boolean    loading  = true; 
private boolean    isPaused; 

@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable final Bundle savedInstanceState) { 
    final View rootView = inflater.inflate(R.layout.fragment_activities_list, container, false); 

    Handler handler; 
    handler = new Handler(); 

    super.setupListUI(NetworkAction.ACTIVITIES_LIST, rootView, true); 

    this.handler = AbstractNetworkFactory.build(super.getContext(), super.networkAction); 
    this.listView = (ListView) rootView.findViewById(R.id.list_view_activities); 

    this.listView.setOnScrollListener(new OnScrollListener() { 
     @Override 
     public void onScrollStateChanged(AbsListView view, int scrollState) { 
     } 

     @Override 
     public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
      if(totalItemCount < pageSize) { 
       return; 
      } 

      if(loading) { 
       if(totalItemCount > previousTotal) { 
        loading = false; 
        previousTotal = totalItemCount; 
        currentPage++; 
       } 
      } 
      if(!loading && (totalItemCount == (firstVisibleItem + visibleItemCount))) { 
       loading = true; 
       Editable text = ActivitiesListFragment.super.txtFilter.getText(); 
       if(text != null && text.toString() != null && !text.toString().isEmpty()) { 
        refreshGrid(text.toString(), null); 
       } 
       else { 
        refreshGrid(null, null); 
       } 
      } 
     } 
    }); 

    if(this.isPaused) { 
     this.listView.setAdapter(adapter); 

     Bundle arguments = getArguments(); 
     if(arguments != null) { 
      String mode = arguments.getString("mode"); 
      if("search".equals(mode)) { 
       Editable text = this.txtFilter.getText(); 

       String toFilter = text.toString(); 
       this.adapter.clearItems(); 
       this.adapter.notifyDataSetInvalidated(); 
       this.currentPage = 0; 
       this.previousTotal = 0; 

       if(toFilter != null && !toFilter.isEmpty()) { 
        refreshGrid(toFilter, null); 
       } 
       else { 
        refreshGrid(null, null); 
       } 
      } 
     } 
     return rootView; 
    } 

    if(!ApplicationOptionsManager.hasOptionsCache(super.getActivity(), networkAction)) { 
     final Count c = new Count(); 
     // this.refreshOptions(true);// false para adicionar "Listar Todos" no 
     final HomeActivity home = (HomeActivity) getActivity(); 

     final Runnable myRunnable= new Runnable() { 
      @Override 
      public void run() 
      { 
       refreshOptions(true); 
       adapter.notifyDataSetChanged(); 
       handler.postDelayed(myRunnable, 60 * 1000); 
      } 
     }; 

    return rootView; 
} 

private void refreshOptions(final boolean isToLoad) { 
    final ProgressDialog dialog = MobileUtils.getBasicProgressDialog(super.getContext()); 
    handler.getOptions(new HttpOptionsBaseListener() { 
     @Override 
     public void onRequestCompleted(OptionsVO options, Integer httpStatus, CharSequence response) { 
      ApplicationOptionsManager.storeOptions(ActivitiesListFragment.super.getActivity(), networkAction, options); 
      if(isToLoad) { 
       String txtToFilter = txtFilter.getText().toString(); 

       if(txtToFilter != null && !txtToFilter.isEmpty()) { 
        refreshGrid(txtToFilter, dialog); 

       } 
       else { 
        refreshGrid(null, dialog); 

       } 
      } 
      else { 
       dialog.dismiss(); 
       // addOne(); "Listar todos" no começo do fragment 
      } 
     } 
    }, new HttpFailListener() { 
     @Override 
     public void onRequestCompleted(Exception e, Integer httpStatus, CharSequence msg) { 
      String txtToFilter = txtFilter.getText().toString(); 

      if(txtToFilter != null && !txtToFilter.isEmpty()) { 
       refreshGrid(txtToFilter, null); 
      } 
      else { 
       refreshGrid(null, null); 
      } 

      dialog.dismiss(); 
     } 
    }); 
} 

private void refreshGrid(final CharSequence textToFilter, final ProgressDialog currentDialog) { 
    super.runRunnableOnUIThread(new Runnable() { 
     @Override 
     public void run() { 
      final ProgressDialog dialog = currentDialog != null ? currentDialog : MobileUtils.getBasicProgressDialog(getContext()); 

      JSONObject where = new JSONObject(); 

      if(textToFilter != null && !textToFilter.toString().isEmpty()) { 
       try { 
        where.put("nmStep", textToFilter); 
       } 
       catch(JSONException e) { 
       } 
      } 

      handler.get(currentPage, new HttpJsonObjectListener() { 

       @Override 
       public void onRequestCompleted(final JSONObject object, Integer httpStatus, CharSequence msg) { 
        final JSONArray array = object.optJSONArray("searchResultsCollection"); 
        ActivitiesListFragment.super.runRunnableOnUIThread(new Runnable() { 
         @Override 
         public void run() { 
          dialog.dismiss(); 

          if(adapter != null) { 
           int count = adapter.getCount(); 
           if(count > 0) { 
            if(array.length() > 0) { 
             adapter.addAll(array); 
            } 
            else { 
             currentPage--; 
             if(currentPage < 0) { 
              currentPage = 0; 
             } 
            } 
           } 
           else { 
            String[] columns = { "nmStep" }; 
            if(array.length() == 0) { 
             JSONObject value = new JSONObject(); 

             try { 
              value.put("id", -1); 
              value.put("nmStep", "Nenhum resultado encontrado."); 

             } 
             catch(Exception e) { 
             } 

             array.put(value); 
            } 
            adapter = new ActivitiesListAdapter(array, columns, ActivitiesListFragment.this); 
            listView.setAdapter(adapter); 
           } 
          } 
          else { 

           if(array.length() == 0) { 
            JSONObject value = new JSONObject(); 

            try { 
             value.put("id", -1); 
             value.put("nmStep", "Nenhum resultado encontrado."); 

            } 
            catch(Exception e) { 
            } 

            array.put(value); 
           } 

           String[] columns = { "nmStep", "dtStartFmt" }; 
           adapter = new ActivitiesListAdapter(array, columns, ActivitiesListFragment.this); 
           listView.setAdapter(adapter); 
          } 
         } 
        }); 
       } 
      }, new HttpFailListener() { 
       @Override 
       public void onRequestCompleted(Exception e, Integer httpStatus, CharSequence msg) { 
        dialog.dismiss(); 
        ActivitiesListFragment.super.runToastOnUiThread(R.string.application_generic_error, Toast.LENGTH_LONG); 
       } 
      }); 

     } 
    }); 
} 

protected int getContentViewId() { 
    return(R.layout.fragment_activities_list); 
} 

@Override protégé vide onFilterForText (CharSequence textToFilter) { si (adaptateur! = Null) { adapter.clearItems(); currentPage = 0; previousTotal = 0; } refreshGrid (textToFilter.toString(), null); }

@Override 
protected int getTitleResource() { 
    return R.string.title_activity_activities_list; 
} 

@Override 
public void onPause() { 
    handler.removeCallbacks(myRunnable); 
    this.isPaused = true; 
    super.onPause(); 
} 

@Override 
public void onResume() { 
    handler.postDelayed(myRunnable, 60 * 1000); 
    super.onResume(); 
} 

public class Count { 
    private int count; 

    public int getCount() { 
     return count; 
    } 

    public void setCount(int count) { 
     this.count = count; 
    } 
} 

public View getChildAt(int position) { 
    return(this.listView.getChildAt(position)); 
} 

}

+0

Vous utilisez une activité d'intermédiaire entre les deux fragments, n'est-ce pas? – Sevle

Répondre

1

tiny sunlight's poste répond à votre question. Cependant, il mentionne que vous ne devriez pas créer un nouveau fragment quand vous voulez simplement mettre à jour votre ListView. En effet, un moyen d'y parvenir est de mettre à jour le contenu de votre liste dans le gestionnaire, plutôt que de créer un nouveau fragment. Un extrait qui permet d'atteindre qui suit:

Handler handler; 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    .... 
    handler = new Handler(); 
} 

@Override 
protected void onResume() 
{ 
    .... 
    handler.postDelayed(myRunnable, 60 * 1000); 
} 

@Override 
protected void onPause() 
{ 
    .... 
    handler.removeCallbacks(myRunnable); 
} 

private final Runnable myRunnable= new Runnable() { 
    @Override 
    public void run() 
    { 
     downloadNewJsonData(); 
     adapter.notifyDataSetChanged(); 
     handler.postDelayed(myRunnable, 60 * 1000); 
    } 
} 

Ce que vous gagnez par c'est d'éviter la mémoire, le temps et les frais généraux de code de remplacement Fragments.

+0

J'essaye ceci, mais j'obtiens l'erreur: java.lang.NullPointerException: Tentative d'invoquer la méthode virtuelle 'void br.com.singlepoint.crm.mobile.view.list.adapter.ActivitiesListAdapter.notifyDataSetInvalidated() 'sur une référence d'objet null – Morfina

+0

Chaque fois que vous naviguez sur une activité différente et perdez le focus sur le fragment actuel, vous devrez informer votre gestionnaire d'arrêter la mise à jour. Je vais éditer ma réponse pour vous donner une idée. – Sevle

+0

J'ai essayé de mettre en œuvre, mais j'ai des problèmes ... Si vous pouvez jeter un oeil, j'ai posté le code complet de ma classe en question. – Morfina

0

Pourquoi u créer un nouveau Fragment mettre à jour?

si vous voulez faire; Ajouter comme ceci:

Fragment a = YourFragment(); 
getSupportFragmentManager().beginTransition().add(a,"a").commitAllowStateloss(); 

enlever comme ceci:

Fragment a = getSupportFragmentManager().findFragmentWithTag("a"); 

if(a!=null){ 
getSupportFragmentManager().beginTransition().remove(a,"a").commitAllowStateloss(); 
} 
+0

Merci petite lumière du soleil. Comment implémenter ce code dans ma classe? (mise à jour sur la question) – Morfina

+0

Où sont nos activités? –