ListView中的CheckedTextView:选择时闪烁问题

时间:2012-03-27 16:32:15

标签: android

我有一个ListView(单选模式),包含CheckedTextView项目(没有复选标记),我设置了适当的选择器来确定当前检查项目的文本颜色和背景颜色。

以下是:

  1. 我按下ListView的项目:“已选中”状态的颜色(红色为黑色)得到正确应用。
  2. 我释放了这个项目:它突然闪烁回到“默认”状态(白色黑色)的颜色,只有几分之一秒。
  3. 短错误闪烁后:项目正确采用“已检查”状态的颜色(黑色为红色,偶然与“选定”状态相同)。
  4. 当然,我需要摆脱这种眨眼效果,我认为这应该相当容易,但不幸的是,我无法弄清楚我做错了什么!

    请注意,错误的闪烁效果仅发生在预先Honeycomb版本的Android上(我在仿真器和物理设备上都检查了这一点。)

    我已经搜遍了整个网络和Stack Overflow以寻找答案,所以请不要向我发现现有的类似帖子(除非他们真的解决了我的问题,当然......)。

    在下文中,您可以找到重现上述问题所需的所有代码。

    活动(是的,它是兼容性库的FragmentActivity,但我认为这并不重要):

    import android.os.Bundle;
    import android.support.v4.app.FragmentActivity;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;
    
    public class TempListActivity extends FragmentActivity{
    
    @Override
    protected void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.temp_list);
    
        ListView listView = (ListView) findViewById(R.id.tempListView);
        String[] array = new String[] { "one", "two", "three" };
        ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, R.layout.temp_list_item, array);
        listView.setAdapter(arrayAdapter);
    }
    
    }
    

    ListView:

    <ListView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/tempListView"
    android:choiceMode="singleChoice"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    </ListView>
    

    CheckedTextView用作ListView项目:

    <CheckedTextView  
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/list_item_title"  
    android:height="?android:attr/listPreferredItemHeight"
    android:textColor="@drawable/list_item_text_custom"
    android:background="@drawable/list_item_custom"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" />
    

    文本颜色选择器(list_item_text_custom.xml):

    <selector
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true" 
        android:color="#000000">
    </item>
    <item android:state_pressed="true"
        android:color="#000000">
    </item>
    <item android:state_selected="true"
        android:color="#000000">
    </item>
    <item 
        android:color="#ffffff">
    </item>
    </selector>
    

    背景颜色选择器(list_item_custom.xml):

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

    突出显示背景的drawable(highlighted_item_background.xml):

    <shape
    xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#ff0000" />    
    </shape>
    

    普通背景的drawable(normal_item_background.xml):

    <shape
    xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#000000" />    
    </shape>
    

    我真的想利用标准的Android选择器机制,而不是被迫找出一些奇特的解决方法,所以如果我在上面的代码中犯了任何错误,请告诉我。

    否则,非常感谢任何帮助或替代解决方案。

    提前致谢。

1 个答案:

答案 0 :(得分:0)

我一直无法为您找到真正的解决方案,但如果我们简化您所拥有的解决方案,也许我们可以找到一些可以接受的东西,作为您喜欢和需要之间的妥协:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
   <item android:state_checked="false"
    android:drawable="@drawable/normal_item_background">
  </item>
  <item
    android:drawable="@drawable/highlighted_item_background">
  </item>
</selector>

基本上我们会默认选中这个选项,并且只在项目取消选中时将其设置为正常