单击后强制ListView项目保持“按下”状态?

时间:2011-02-01 07:43:19

标签: android listview onclick

我有一个ListView,当通过onItemClick监听器点击项目行时,它会打开另一个活动。

我希望该行从点击时到屏幕切换到新活动时保持按下状态。我认为这对用户来说是一个更清晰的体验,你会看到这种事情,大多数按钮都可以打开/关闭对话框或切换活动。

我尝试在onItemClick()侦听器中设置view.setPressed(true),但似乎在按下状态变回正常状态后调用了一会儿,因为它稍微闪烁。

例如:

mListView.setOnItemClickListener(new OnItemClickListener() {

   @Override
   public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
       view.setPressed(true);
       //start an activity
   }
});

该代码几乎可以工作,除了闪烁(用户按下列表项并转到其按下状态,然后用户放开(完成点击),然后转回到正常状态一瞬间,然后返回到来自setPressed(true)调用的按下状态)

有什么想法吗?

由于

编辑:我应该提一下,我正在使用xml drawable选择器来定义列表背景的正常,按下,选择等状态。

7 个答案:

答案 0 :(得分:26)

我有同样的问题非常沮丧!

然而,用state_pressed代替state_selected可以轻松解决这个问题。在调用onItemClick()之前,按下的状态仍会快速变化,但由于您的主题不依赖于state_pressed,因此闪烁将不可见。进入onItemClick()后,您设置state_selected,该项目将保持选中状态,不会出现任何闪烁。

这是我的选择器:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Selected Item -->
    <item android:state_selected="true"
        android:drawable="@color/list_pressed" />

    <!-- Default Item -->
    <item android:state_selected="false"
        android:drawable="@android:color/list_default" />
</selector>

我的onListItemClick(...):

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
    v.setSelected(true);
    //TODO: add further actions here
}

答案 1 :(得分:6)

在Android 3.0之前,最好的方法是在自定义视图中使用自定义状态或从适配器更改视图的背景颜色。从Android 3.0开始,您可以使用新的state_activated来保留选定的列表项。

答案 2 :(得分:3)

从适配器内部,您可以引用要更改状态的视图。假设您有一个带有标题和星号的ListView(即最喜欢的星星),并且您希望触摸时保持“选中/按下”。覆盖你的getView并执行以下操作:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    final View view = super.getView(position, convertView, parent);
    final ImageButton favorite = (ImageButton) view.findViewById(R.id.favorite);
    favorite.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.d(TAG, "Star pressed...");
            v.setSelected(!v.isSelected());
        }
    });
    return view;
}

你的ImageButton布局应该像这样引用一个drawable:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true" android:drawable="@android:drawable/star_big_on" />
    <item android:state_pressed="true" android:drawable="@android:drawable/star_big_on" />
    <item android:drawable="@android:drawable/star_big_off" />
</selector>

答案 3 :(得分:2)

您正在使用xml作为选择器。检查你是否正确地给了州 设置view.setPressed(true)时,它将使用为状态android:state_pressed="true"设置的drawable,如

<item android:state_pressed="true"   
    android:drawable="@color/gray" />

答案 4 :(得分:0)

您是否已尝试将unscheduleDrawabledrawableStateChanged

结合使用

所以你可以听一下状态是否改变然后立即取消安排并将其重新设置为按下状态。

也许没有闪烁了。

答案 5 :(得分:0)

在此示例中,在列表项中按下按钮后会更改背景。 http://androidforbeginners.blogspot.com/2010/03/clicking-buttons-in-listview-row.html

你可以通过操纵传递给这个调用的View来在onItemSelected()中做类似的事情。通常传递的视图是一个LinearLayout,它包含子视图,如textView。

答案 6 :(得分:0)

不要使用选择器XML。而是手动更改列表项图像。这样您就可以控制特定图像的持续时间