2011-01-03 5 views
1

Von this Antwort im Stapelüberlauf und die sample project verwiesen dort, ich habe die Idee von RotationAsync, wo ein Fortschrittsbalken gut mit Geräte-Rotation funktionieren.RotationAsync mit jeder Zeile in Listenansicht

Aber mein Problem ist, ich habe eine listview mit jeder Zeile gibt progress bar ist. Und gibt es einen Weg zu behalten Sie den Fortschritt während der Drehung für Zeile erreichen.

Ich erstelle onclicklistener Objekt für den Button Klick Listener in getview Funktion meiner adapter Klasse. Wo sein onClick Funktionsaufruf der AsyncTask Klasse

Da jede getview (Reihe) verschiedene Instant meines AsyncTask nennt, kann ich es nicht von einzelnen Tonnen-Klasse statisch.
Irgendeine Idee dazu.
Danke.

Antwort

2

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

0


Sie können Android gesetzt: configChanges = „Orientierung“ in-Manifest-Datei Ihre Tätigkeit zu machen, nicht neu gestartet, wenn

+0

Vielen Dank.Es ist nur gut, wenn ich nur ein Layout für Querformat und Hochformat brauche. Überprüfen Sie die andere Antwort –

0


Eine Lösung rotierende, die ich verwenden Wenn wir nur ein Layout sowohl für Quer- und Hochformat haben Modus, dann können wir das können wir die Aktivität von 1. Stellen Sie lösen asandroid:configChanges="orientation" in Manifest-Datei
2. Aufschalten der onConfigurationChanged wie diese

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

    } 

Aber das Problem ist immer noch, wenn ich unterschiedliche Layout für Querformat und Hochformat verwenden muss, haben Sie jeweils eine Listview mit Fortschrittsbalken in jeder Zeile. Dort muss ich den Fortschritt beim Drehen beibehalten, die die gleiche AsyncTask-Klasse verwenden.

0

Wie können Sie für jedes Zeilenelement einen Prozentwert festlegen? Warum aktualisieren Sie diesen Wert nicht für das Datenelement? Sie können etwas wie unten haben. Da Sie das Datenelement haben, können Sie speichern, was Sie wollen :)
Ps: Ich frage mich, ob ich Text im Kommentar formatieren kann, um keine neue Antwort hinzuzufügen.

Verwandte Themen