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.
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.
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.
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.
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
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"
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With