Android RotationAsync与列表视图中的每一行同步
从堆栈溢出中的答案和这里提到的,我得到了RotationAsync的想法,其中一个进度条与设备旋转配合良好 但是我的问题是,我有一个Android RotationAsync与列表视图中的每一行同步,android,rotation,android-asynctask,Android,Rotation,Android Asynctask,从堆栈溢出中的答案和这里提到的,我得到了RotationAsync的想法,其中一个进度条与设备旋转配合良好 但是我的问题是,我有一个列表视图,每行都有进度条。在为到达行旋转时,是否有办法保留进度 我正在为我的适配器类的getview函数中的按钮单击侦听器创建onclicklistener对象。其中其onClick函数调用AsyncTask类 由于每个getview(行)都在调用我的AsyncTask的不同瞬间,因此我无法将其设置为单吨级的静态。 有什么想法吗。 谢谢 您可以在清单文件中设置and
列表视图
,每行都有进度条
。在为到达行旋转时,是否有办法保留进度
我正在为我的适配器
类的getview
函数中的按钮单击侦听器创建onclicklistener对象。其中其onClick
函数调用AsyncTask类
由于每个getview
(行)都在调用我的AsyncTask
的不同瞬间,因此我无法将其设置为单吨级的静态。有什么想法吗。
谢谢
您可以在清单文件中设置android:configChanges=“orientation”,使您的活动在旋转时不会重新启动 我使用的一种解决方案 如果我们只有一个布局的横向和纵向模式,那么我们可以解决这个问题 1.在清单文件中设置活动asandroid:configChanges=“orientation”
2.像这样覆盖
onConfigurationChanged
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}
但问题仍然在于,如果我需要对横向和纵向模式使用不同的布局,则每一行都有一个带有进度条的列表视图。在那里,我需要在使用相同的AsyncTask类进行轮换时保留进度 如何设置每行项目的百分比值?为什么不将该值更新到数据项中呢。你可以有下面这样的东西。由于您有数据项,您可以存储任何您想要的内容:)
Ps:我想知道我是否可以在注释中设置文本格式,以避免添加新答案
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView,
ViewGroup parent)
public Object getChild(int groupPosition, int childPosition)
所以你有一个ListView,我假设你有一些适配器,在它的get视图中承载进度条。然而,这一进展必须得到某种支持,对吗?所以只需保存这些数据。就像我假设的适配器一样:
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.
...
}
这样,当您翻转方向时,适配器将重新创建,但它将重新初始化为以前的状态。我对您存储进度的方式和任务的性质做了一些假设,但我希望您可以根据需要进行调整
如果不存储对任何上下文的引用,甚至可以将整个适配器本身存储在OnRetainOnConfiguration实例()中,并在GetLastRetainedOnConfiguration实例()中使用它。谢谢。只有当我只需要一个布局的横向和纵向模式。检查另一个答案
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
...
}