Android ListView半透明选择行的颜色

5

我需要实现列表视图中一行的半透明选中状态,以及对于“按下”状态也是如此。

如果我使用纯色,那么一切都按预期工作。但是如果我应用半透明的颜色(#44444444),那么我会看到默认的选择颜色(在我的2.3安卓上是橙色),在其上面有我的颜色(它将橙色变暗了一些)。

为什么我的颜色下面还有橙色? 如何解决这个问题?

以下是我的代码: 在drawable/listselectorinvisible.xml中的选择器xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="false"
    android:state_selected="false"
    android:drawable="@color/transparent" />

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

<item android:state_selected="true" android:state_pressed="false"
    android:drawable="@color/semitransparent" />
</selector>

Listview的行在layout/topscore_row.xml中定义。

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" 
android:layout_height="wrap_content" 
android:layout_width="fill_parent"
android:background="@drawable/listselectorinvisible">
  <TextView android:layout_height="wrap_content" android:id="@+id/scrowNum" android:textColor="@color/fontButColor" android:text="#" android:textSize="24sp" android:layout_width="32dip" android:gravity="right|top" android:layout_gravity="top"></TextView>
  <LinearLayout android:layout_height="wrap_content" android:id="@+id/scrowNamLay" android:layout_width="142dip" android:orientation="vertical">
    <TextView android:layout_height="wrap_content" android:paddingTop="2dip" android:layout_width="fill_parent" android:id="@+id/scrowPlayer" android:textColor="@color/fontButColor" android:text="@string/tblPlayer" android:textSize="24sp" android:paddingLeft="2dip"></TextView>
    <TextView android:layout_height="wrap_content" android:layout_width="fill_parent" android:id="@+id/scrowOpPlayer" android:textColor="@color/fontButColor" android:text="@string/tblPlayer" android:textSize="14sp" android:paddingLeft="2dip"></TextView>
  </LinearLayout>
  <ImageView android:id="@+id/scrowImg" android:layout_height="wrap_content" android:src="@drawable/small_im_bt" android:padding="2dip" android:layout_marginTop="2dip" android:layout_width="26dip"></ImageView>
  <TextView android:layout_height="wrap_content" android:layout_width="48dip" android:id="@+id/scrowScore" android:layout_marginRight="5dip" android:gravity="right" android:textColor="@color/fontButColor" android:text="@string/tblScore" android:textSize="26sp"></TextView>
  <TextView android:layout_height="wrap_content" android:id="@+id/scrowTime" android:textColor="@color/fontButColor" android:text="@string/tblTime" android:gravity="center_horizontal" android:textSize="26sp" android:layout_width="58dip"></TextView>
</LinearLayout>

最后是列表视图本身:

<ListView android:layout_width="match_parent" android:id="@+id/scoreList" android:paddingLeft="5dip" android:paddingRight="5dip" 
  android:cacheColorHint="#00000000" 
  android:choiceMode="none" 
  android:clickable="false" 
  android:focusable="false" 
  android:focusableInTouchMode="false" 
  android:longClickable="false" android:layout_height="298dip">
</ListView>

在尝试在xml中设置颜色失败后,我还尝试通过convertView.setBackgroundResource(R.drawable.listselectorinvisible);在我的CustomArrayAdapter中设置listselectorinvisible,但没有成功。

CustomAdapter的代码:

        /* (non-Javadoc)
     * @see android.widget.ArrayAdapter#getView(int, android.view.View, android.view.ViewGroup)
     */
    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        View v = convertView;
        if (v == null) 
        {
            LayoutInflater vi = (LayoutInflater)app.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.topscore_row, null);
        }

        Score score = objects.get(position);
        int color = getColor(position, score);

        if (score != null) 
        {
            ImageView iv = (ImageView) v.findViewById(R.id.scrowImg);
            if (iv != null) 
            {
                iv.setImageResource(imgs[score.gameType]);
            }
            TextView tv = (TextView) v.findViewById(R.id.scrowNum);
            tv.setText(Integer.toString(position+1) + ".");
            tv.setTypeface(app.mainFont);
            tv.setTextColor(color);
            .... ....               
        }

        v.setBackgroundResource(R.drawable.listselectorinvisible);

        return v;

    }               

Thank you in advance.

3个回答

7

您需要在ListView中设置android:listSelector="@drawable/listcolor"

您的ListView将会

<ListView android:layout_width="match_parent" android:id="@+id/scoreList" android:paddingLeft="5dip" android:paddingRight="5dip" 
  android:cacheColorHint="#00000000" 
  android:choiceMode="none" 
  android:clickable="false" 
  android:focusable="false" 
  android:focusableInTouchMode="false" 
  android:longClickable="false" 
android:listSelector="@drawable/listcolor"
android:layout_height="298dip">
</ListView>

请查看以下网址

如何将选择颜色设置为ListView

谢谢 Deepak


有趣,谢谢。不过我在想,这是否会减慢事情的速度,因为它抑制了cacheColorHint的优化机制。今晚我会尝试使用半透明颜色,就像Northern Captain建议的那样,我喜欢这个设计。 - Snicolas
谢谢建议。我刚刚在模拟器上尝试了一下,橙色消失了,我只看到我的半透明色。但是当我按列表中的项时,这个颜色也被应用到整个列表上。我没有在真实设备上尝试过,因为我手头没有设备,也许这是模拟器中的一个 bug... - Northern Captain
@Snicolas - 我也尝试了你的代码addStatesFromChildren,但它并没有改变任何东西。 - Northern Captain
在真机上检查了android:listSelector属性并得到了相同的效果:当处于按下状态时,选择器颜色被应用于整个listview,而不仅仅是按下的行。有什么想法吗? - Northern Captain

2

经过数小时的尝试,我终于找到了解决方案。

首先,在ListView中设置listSelector="@android:color/transparent"(由于某种原因,@null在此处不起作用)

其次,将您行的最高级父背景设为带有状态的可绘制对象(可能是带有状态的颜色),其中state_pressed="@color/with_transparency"


我想补充一点,将列表背景颜色设置为大多数人想要的实心颜色是安全的。 - Daniel Wilson

0

我不知道这是否重要,但是您的选择器没有默认状态(应该是最后一个)。

此外,这并不能回答您的问题,但是在 top_score 行中,请考虑将以下内容添加到您的 xml 根布局中:

android:addStatesFromChildren="true" 

它将显示列表项以捕获子元素的状态,即使复合组件作为单个组件并获取其中任何组件的状态。(例如,如果选择了一个,则复合组件变为已选择)。

敬礼, 斯蒂芬


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接