0

我有一个包含图像的 ListView,这些图像来自服务器,加载程序下载图像然后在onLoadFinishedListViewsetAdapter中。设置适配器后,我尝试选择 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 个或多个项目,您难道不能只针对 ListAdapter注册一个DataSetObserver来设置onChange()事件的选择吗?

于 2012-09-28T21:24:45.053 回答
0

如果你不使用标题,你可以听ListView层次结构变化OnHierarchyChangeListener

private boolean needSelection = true;

public void onChildViewAdded(View parent, View child) {
  if (needSelection && indexOfChild(child) == 0) {
    trySelectChild(child);
    needSelection = false;
  }
}
于 2012-10-09T08:11:42.380 回答