Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

android listview semitransparent selection color of a row

I need to implement a semi-transparent selection of a row in a listview, and for 'pressed' state also.

If I apply solid color, then everything is working as expected. But if I apply semi-transparent color (#44444444) then I see default selection color (orange on my 2.3 android) and on top of it there is my color (it dims orange a little).

Why is there orange color under my one? How to fix this problem?

Here is my code: Selector xml in drawable/listselectorinvisible.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 row is defined in 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>

And finally the listview itself:

<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>

After failure of setting color in xml, I also tried to set listselectorinvisible in my CustomArrayAdapter via convertView.setBackgroundResource(R.drawable.listselectorinvisible); but no luck.

Code of the 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.

like image 468
Northern Captain Avatar asked Jun 01 '11 11:06

Northern Captain


People also ask

How to change the color of last selection in a listview?

If you want a programmatic way to handle this then use method 2... If you're using a ListFragment you can override onListItemClick (), using the view to set the colour. Save the current View selected to reset the colour of the last selection. Please note, this only works on listviews that fit on one screen, as the view is recycled.

How to highlight selected selected listview item's background?

After tried for a while, I found the simplest way to highlight selected ListView item's background can be done with only two lines set to the ListView's layout resource: android:choiceMode="singleChoice" android:listSelector="YOUR_COLOR" There's also other way to make it work, like customize activatedBackgroundIndicator theme.

Is there a way to show the current selected item in listview?

Furthermore, there is one properties here on ListView which is called listSelector. It's a drawable as said by the documentation "Drawable used to indicate the currently selected item in the list." I also believe that this should do the trick and yes it do the trick on my emulator but not on my galaxy tab.

How to set the background drawable to listview custom layout?

Set the background drawable to listview custom layout to be inflated for each row I recommend using a custom listview with a custom adapter. If you have not used a custom adapter you can set the listselector to listview as below


2 Answers

After hours of playing around with the same issue, I finally got a solution.

First, in the ListView set listSelector="@android:color/transparent" (for some reason @null doesn't work here)

Second, have your row's most parent background be a stateful drawable (possibly stateful color) with state_pressed="@color/with_transparency"

like image 22
Max Ch Avatar answered Oct 06 '22 13:10

Max Ch


You have to set android:listSelector="@drawable/listcolor" in ListView

Your ListView will be

<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>

Have a look on the below URl

How to set Selection Color to ListView

Thanks Deepak

like image 200
Sunil Kumar Sahoo Avatar answered Oct 06 '22 13:10

Sunil Kumar Sahoo