1

画面の回転後に選択したリスト項目をプログラムで (再) 強調表示したい。

public class MyListFragment extends ListFragment {
    private static final String tag = MyListFragment.class.getName();
    private static final String indexTag = "index";
    private int index = -1;

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
        if (savedInstanceState != null) {
            index = savedInstanceState.getInt(indexTag, -1);
            Log.d(tag, "Restored index " + index + " from saved instance state.");
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        if (index >= 0) {
            showDetails(index);
        }
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        showDetails(position);
    }

    private void showDetails(int index) {
        this.index = index;
        getListView().setItemChecked(index, true);
        // update details panel
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt(indexTag, index);
    }
}

カスタム アダプターのアイテム ビューとして CheckedTextView を使用します。

public class MyListAdapter extends BaseAdapter {
    private static final String tag = MyListAdapter.class.getName();

    @Override
    public CheckedTextView getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null || !(convertView instanceof CheckedTextView)) {
            final LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.simple_list_item_single_choice, parent, false);
        }
        ((CheckedTextView)convertView).setText("test");
        return (CheckedTextView)convertView;
    }
}

画面の回転showDetails()が呼び出され、詳細パネルが更新された後setItemChecked()、何も実行されず、アイテムがまだ強調表示されていません。setItemChecked()また、タッチイベントでクリックした項目は不要で、とにかく行が強調表示されることに気付きました。

では、onResume ステージでアイテムをプログラムでチェックするにはどうすればよいでしょうか。

4

2 に答える 2

1

onActivityCreate() に showIndex(index) を入れます。これは、画面の回転時に Android が現在のアクティビティを破棄し、Bundle savedInstanceState を介して現在の状態を保存する別のアクティビティを作成するためです。

于 2013-08-09T15:24:23.737 に答える
0

問題を解決しました。AsyncTaskアクティビティでリスト アダプターを設定していることを忘れていたので、 showDetails()onResume ステージで が呼び出されたときに、フラグメントにはまだ空のリストがあります。

したがってonResume、フラグメントからメソッドを削除し、showDetails()公開して、アダプターを設定した後にアクティビティから呼び出します。

    public void onListLoadDone(...) {
        final MyListAdapter adapter = new MyListAdapter(...);
        myListFragment.setListAdapter(adapter);
        myListFragment.showDetails();
    }
于 2013-08-09T16:09:30.757 に答える