Sie haben also eine ListView, von der ich annehme, dass Sie einen Adapter haben, der in seiner Ansicht die Fortschrittsbalken empfängt. Aber dieser Fortschritt muss von etwas unterstützt werden, richtig? Speichern Sie diese Daten einfach. Ich nehme einen Adapter wie folgt an:
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.
...
}
und dann brauchen Sie onConfigurationChanged nicht wirklich. Lesen und speichern Sie Ihre Daten entsprechend.
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
...
}
, die es wird, so dass, wenn Sie die Ausrichtung drehen, wird der Adapter neu erstellt werden, aber es wird in den gleichen Zustand es in vorher war neu initialisiert werden. Ich habe einige Annahmen über die Art, wie du deinen Fortschritt speicherst, und die Art deiner asyncTasks gemacht, aber ich hoffe, du kannst sie nach Bedarf anpassen.
Man könnte sogar, wenn Sie zu irgendeinem Kontext keine Referenz speichern, könnten Sie in der Lage sein, um wegzukommen mit nur den gesamten Adapter speichert sich im Inneren des onRetainNonConfigurationInstance() und die Verwendung dieser in der getLastRetainedNonConfigurationInstance()
Vielen Dank.Es ist nur gut, wenn ich nur ein Layout für Querformat und Hochformat brauche. Überprüfen Sie die andere Antwort –