Android RotationAsync与列表视图中的每一行同步

Android RotationAsync与列表视图中的每一行同步,android,rotation,android-asynctask,Android,Rotation,Android Asynctask,从堆栈溢出中的答案和这里提到的,我得到了RotationAsync的想法,其中一个进度条与设备旋转配合良好 但是我的问题是,我有一个列表视图,每行都有进度条。在为到达行旋转时,是否有办法保留进度 我正在为我的适配器类的getview函数中的按钮单击侦听器创建onclicklistener对象。其中其onClick函数调用AsyncTask类 由于每个getview(行)都在调用我的AsyncTask的不同瞬间,因此我无法将其设置为单吨级的静态。 有什么想法吗。 谢谢 您可以在清单文件中设置and

从堆栈溢出中的答案和这里提到的,我得到了RotationAsync的想法,其中一个进度条与设备旋转配合良好

但是我的问题是,我有一个
列表视图
,每行都有
进度条
。在为到达行旋转时,是否有办法保留进度

我正在为我的
适配器
类的
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
 ... 
}