2011-01-03 6 views
1

De this réponse dans le débordement de la pile et le sample project référencé là, j'ai eu l'idée de RotationAsync, où une barre de progression fonctionne bien avec la rotation du périphérique.RotationAsync avec chaque ligne dans la vue Liste

Mais mon problème est, j'ai un listview avec chaque ligne il y a progress bar. Et est-il possible de conserver la progression tout en rotation pour atteindre la ligne.

Création d'un objet onclicklistener pour l'écouteur de clic de bouton dans la fonction getview de ma classe adapter. Où sa classe AsyncTask

appel de fonction onClick Comme chaque getview (ligne) appelle instant différent de mon AsyncTask, je ne peux pas le rendre statique de classe unique tonne.
Une idée à ce sujet.
Merci.

Répondre

2

Donc vous avez un ListView dont je suppose que vous avez un adaptateur qui dans sa vue obtient les barres de progression. Cependant, ce progrès doit être soutenu par quelque chose de bien? Il suffit donc de sauvegarder ces données. Comme je suppose un adaptateur comme ceci:

public class MyProgressBarAdapter extends BaseAdapter { 
private ArrayList<Integer> mProgessValues; 
private SparseArray<AsyncTask<?,?,?>> mTasks; 
// No stored reference to a Context 

private MyProgressBarAdapter() { 

} 

public void saveState(Bundle bundle) { 
    bundle.putIntegerArrayList(getClass().getName() + ".progressValues", mProgressValues); 
} 

public Object exportLiveState() { 
    return mTasks; 
} 

public static MyProgressBarAdapter restore(Bundle bundle, Object rawState) { 
    MyProgressBarAdapter adapter = new MyProgressBarAdapter(); 
    Class<MyProgressBarAdapter> c = adapter.getClass(); 
    ArrayList<Integer> progresses = null; 

    if (bundle != null) { 
     progresses = bundle.getIntegerArrayList(c.getName() + ".progressValues"); 
    } 

    if (progresses == null) { 
    progresses = new ArrayList<Integer>(); 
    } 
    adapter.mProgressValues = progresses; 

    if (rawState != null && rawState instanceof SparseArray) { 
    adapter.mTasks = (SparseArray<AsyncTask<?,?,?>>) rawState; 
    } 

    return adapter; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
    convertView = getViewWithHolder(convertView, parent); 
    ViewHolder holder = convertView.getTag(); 
    // set the appropriate things on the view elements. 
    holder.position = position; 
    holder.taskContainer = mTasks; 
    holder.progressBar.setProgress(mProgressValues.get(position)); 
    convertView.setOnClickListener(new OnClickListener() { 
     public void onClick(View view) { 
      ViewHolder holder = view.getTag(); 
      int pos = holder.position; 
      SparseArray<AsyncTask> tasks = holder.taskContainer; 
      AsyncTask task = tasks.get(pos); 
      if (task == null) { 
      // Create your task 
      task = new AsyncTask<?, ?, ?> (...); 
      tasks.put(pos, task); 
      task.execute(); 
      } 
     } 
    return convertView; 
    } 
    /// You can write the rest of the adapter I believe. 
... 
} 

et vous n'avez pas vraiment besoin onConfigurationChanged. Il suffit de lire et d'enregistrer vos données en conséquence.

public class MyActivity extends Activity { 

ListView mListView; 
MyProgressBarAdapter mAdapter; 

@Override 
public void onCreate(Bundle savedState) { 
    super.onCreate(); 
    Object[] liveState = getLastNonConfigurationInstance(); 

    setContentView(R.layout.mylistview_with_progressbars); 
    mListView = findViewById(R.id.listview); 
    // Be consistent with the index 
    MyProgressBarAdapter adapter = MyProgressBarAdapter.restore(savedState, liveState[0]); 
    mListView.setAdapter(adapter); 
    mAdapter = adapter; 
    ... 
} 

@Override 
public void onSaveInstanceState(Bundle bundle) { 
    mAdapter.save(bundle); 
} 

@Override 
public Object[] onRetainNonConfigurationInstance() { 
    // size to be whatever live state you need to store other than the adapter 
    Object[] objects = new Object[1]; 
    // This reference will be retained between onCreate() and onDestroy() calls. 
    objects[0] = mAdapter.exportLiveState(); 
    // Any other things that can't be serialized 
    return objects; 
} 

@Override 
public Object[] getLastNonConfigurationInstance() { 
    Object[] live = (Object[]) super.getLastNonConfigurationInstance(); 
    if (live == null) { 
    live = new Object[1]; 
    } 
    return live; 
} 

// The rest of your activity 
... 
} 

Cela fera en sorte que lorsque vous retournez l'orientation, l'adaptateur sera recréée, mais il sera réinitialisée au même état où il était avant. J'ai fait quelques suppositions sur la façon dont vous stockez vos progrès et la nature de vos asyncTasks mais j'espère que vous pouvez ajuster au besoin.

Vous pouvez même, si vous ne stockez pas une référence à un contexte, vous pourriez être en mesure de sortir avec juste ranger l'adaptateur lui-même toute l'intérieur du onRetainNonConfigurationInstance() et l'utilisation que dans le getLastRetainedNonConfigurationInstance()

0


Vous pouvez définir android: configChanges = « orientation » dans le fichier manifeste pour que votre activité ne redémarre pas lors de la rotation

+0

Merci.C'est bon seulement si j'ai besoin d'une seule mise en page pour les modes paysage et portrait. Vérifiez l'autre réponse –

0


Une solution que j'ai utilisé Si nous avons une seule mise en page pour les formats portrait et paysage le mode, nous pouvons nous pouvons résoudre ce problème en 1. Définissez l'activité asandroid:configChanges="orientation" dans le fichier manifeste
2. Remplacer le onConfigurationChanged comme celui-ci

@Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 

    } 

Mais le problème est toujours le si j'ai besoin d'utiliser une mise en page différente pour le mode paysage et le mode portrait, chacun a une liste avec barre de progression dans chaque rangée. là j'ai besoin de conserver la progression tout en tournant qui utilise la même classe AsyncTask.

0

Comment pouvez-vous définir la valeur en pourcentage pour chaque élément de ligne? Pourquoi ne mettez-vous pas cette valeur à jour dans l'élément de données? Vous pouvez avoir quelque chose comme ci-dessous. Puisque vous avez l'élément de données que vous pouvez stocker ce que vous voulez :)
Ps: Je me demande que je peux mettre en forme le texte dans le commentaire pour ne pas ajouter une nouvelle réponse.

public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, 
     ViewGroup parent) 

public Object getChild(int groupPosition, int childPosition) 
Questions connexes