让安卓ListView高亮某行

真的不太懂安卓的逻辑 🙁

有一个单选模式的ListView:

    <ListView
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:id="@+id/listView"
    android:layout_gravity="center_horizontal"
    android:choiceMode="singleChoice"
    android:clickable="true"
    android:listSelector="@android:color/holo_green_light"
    android:layout_weight="1" />

点击某一项后,会自动高亮成绿色,很好用。
然而为了让它在初始化后自动高亮某行,试过以下方案:

  • setSelection,没用,说是什么TouchMode下的Selection根本就没有选中效果云云,而且列表明明有高亮,getSelectedItemPosition返回却是-1
  • setItemChecked,原来用户选中的行的pos,是通过getCheckedItemPosition拿到的,真难猜!于是想当然调用setItemChecked不就能让某行选中了嘛?然而,没屌用!怒,用Handler.postDelayed延时一会儿再调用呢?还是没屌用!
  • 继续搜索,发现了这货:performItemClick。哇哈哈,模拟点击,Symbian时代惯用的流氓招数嘛,应该很对路子。研究一下参数先:public boolean performItemClick(View view, int position, long id),额,看不懂,放狗直接搜个示例代码来用,还是没屌用!能听到点击声,但选不中列表项。故技重施,postDelayed一下,依然没屌用!
  • 继续放狗瞎晃悠,找到这篇,看来这才是正规的模拟点击啊:

    View temp = list.getChildAt(0);
    list.onTouchEvent( MotionEvent.obtain( SystemClock.uptimeMillis(),
    SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, temp.getX(), temp.getY(), 0 ) );

    加上postDelayed试了一下,果然OK了,好曲折……

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据