1

ネットワークからデータソースを取得するリストビューがあります(非常に大きなリスト)。私がやっていることは、リストビュー項目に2つの異なるレイアウトを提供することです(そのリストのラベルを移動して、横向きモードでのビューの幅を利用してください)。携帯電話を回転させたときにアクティビティをリロードしたくないので、マニフェスト ファイルに設定します

android:configChanges="orientation"

次に、アクティビティにオーバーライド メソッド onConfigurationChanged() を実装して、ListAdapter がランドスケープの場合 (newConfiguration.orientation をチェックして)、新しいリストビュー アイテム (ランドスケープ モードの場合) で更新できるようにします。この listadapter を作成し、notifyDataSetChanged() を呼び出し、さらに listview.invalidate() を呼び出して、リストビュー全体を再描画します。私が得たのは大きな驚きでした.一部のアイテムは新しいリストビューアイテム(横向きモード)に変更され、他のリストビューアイテムは変更されていません.

私はこれに多くの時間を費やしましたが、これについての手がかりがありません。助けてください! ありがとうございます。

4

2 に答える 2

2

handler を介して onConfigurationChanged() 内で行っていることは何でも試してみることができますか?

何かのようなもの:

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

    handler.sendEmptyMessageDelayed(1,500);
}   

Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {            
        if(msg.what == 1) {
            // do your onConfigurationChanged Stuff
        }
    }
  };

ここでは、onConfigurationChanged の後で ListView を更新するまでしばらく待つ必要があると思います。

于 2012-08-02T09:32:07.020 に答える
1

android:configChanges="orientation"多くの場合、進むべき道ではありません。私が見ているように、それはあなたの場合にも当てはまります。

同様の問題に遭遇したときに私が行った非常に簡単な修正の1つは、リストビューのデータを返し、onCreateでリストを再作成するためonRetainNonConfigurationInstance()に呼び出してそれを使用することでした。getLastNonConfigurationInstance()どこかからデータをロードするか、リストビューのデータ変数に getLastNonConfigurationInstance() をキャストするかの間でロジックをフォークするために、null チェック (および安全のために追加の instanceOf ) を実行できます。

私のonCreateからのサンプルコード:

if (getLastNonConfigurationInstance() == null) {
  catalogUpdater.start(); // start background task of populating your list's contents variable, in my case tempItems
} else {
  tempItems = (ArrayList<WatchListItem>) getLastNonConfigurationInstance();
  watchListAdapter = new WatchListItemBaseAdapter(MyActivity.this, tempItems);
...
于 2012-08-02T09:54:46.303 に答える