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()
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 –