0

画像が含まれるListViewがあり、これらの画像はサーバーから取得され、ローダーが画像をダウンロードしonLoadFinishedsetAdapterからListViewにダウンロードします。アダプターを設定した後、ListView の最初の項目を選択しようとしましたが、効果がありません。ListView はまだ選択する準備ができていないのではないかと思ったので、 setSelection 関数をオーバーライドするような奇妙な方法でそれを行うことができました。

public void setSelection(final int position) {
    // TODO Auto-generated method stub

    mHandler.postDelayed(new Runnable() {
        @Override
        public void run() {
            Log.i(TAG, "thread runned.");
            boolean is_view_created = false;

            while (!is_view_created) {
                try {
                    Thread.sleep(100);
                    getListView();
                    if (getListView().getChildAt(position) != null)
                        is_view_created = true;
                    else {
                        Log.i(TAG, "Waiting for the list view to initialize.");
                    }
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IllegalStateException e) {
                    Log.i(TAG, "Waiting for the list view to initialize.");
                }
            }
            MiddleMenuListFragment.super.setSelection(position);
            View initial_selection_view = getListView().getChildAt(position);
            initial_selection_view.performClick();
            ((MiddleMenuListAdapter)getListAdapter()).light_me_up = position;
            getActivity().runOnUiThread(new Runnable(){
                @Override
                public void run() {
                    ((MiddleMenuListAdapter)getListAdapter()).notifyDataSetChanged();   
                }
            });

        }
    }, 400);
}

しかし、この方法は本当に安全ではありません。時々ループに入る(getListView().getChildAt(position != null)真にならない)。問題に対するよりエレガントな解決策をアドバイスできますか?

4

2 に答える 2

0

ListAdapter に1 つ以上の項目がある場合、 onChange()イベントで選択を設定するために、ListAdapterに対して DataSetObserver を登録できませんでしたか?

于 2012-09-28T21:24:45.053 に答える