Listview selector with colored background and ripple effect

后端 未结 6 1036
误落风尘
误落风尘 2020-12-07 12:27

Standard ListView selector in android L developer preview uses colorControlHighlight for the ripple effect on touch and has a transparent backgroun

相关标签:
6条回答
  • 2020-12-07 12:57

    I've managed to get individually colored list items while maintaining the ripple effect. Set the background of your list items using whatever adapter you have and set the listview to show the selector on top:

    <ListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:drawSelectorOnTop="true" />
    

    This will draw the ripple effect above the background.

    0 讨论(0)
  • 2020-12-07 13:00

    The sample layout, which contains the Ripple effect as Background of the the parent layout.

    <RelativeLayout 
                    android:id="@+id/id4"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:background="@drawable/ripple_effect"
                    android:clickable="true">
    
                    <ImageView 
                        android:id="@+id/id3"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_alignParentLeft="true"
                        android:background="@drawable/image"
                        android:layout_centerVertical="true"/>
    
                    <LinearLayout
                        android:id="@+id/id2" 
                        android:layout_width="fill_parent"
                        android:layout_height="wrap_content"
                        android:orientation="vertical"
                        android:layout_alignParentRight="true"
                        android:layout_centerVertical="true">
    
                        <TextView 
                            android:id="@+id/id1"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="@string/text"/>
    
                    </LinearLayout>
                </RelativeLayout>
    

    Ripple_effect.xml Here you can use any colour of you choice. Make sure that you use sdk version 21 and have drawable-v21 and style-v21 folder and put all the file related to v21 in them.

    <ripple xmlns:android="http://schemas.android.com/apk/res/android" 
                      android:color="?android:colorControlHighlight">
        <item android:id="@android:id/mask">
            <shape android:shape="oval">
                <solid android:color="?android:colorAccent" />
            </shape>
        </item>
    

    Here you can use different shape like rectangle instead of oval...

    0 讨论(0)
  • 2020-12-07 13:04

    You can achieve this with a nested Layout. Just create e.g. a LinearLayout as root layout around your existing layout, set the ripple effect on the root layout and your background color to the nested one.

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/ripple_effect"
        android:orientation="vertical">
    
        <RelativeLayout xmlns:app="http://schemas.android.com/apk/res-auto"
            android:id="@+id/containterContent"
            android:background="@color/yourCOLOR"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
            <!-- Your content -->
    
        </RelativeLayout>
    </LinearLayout>
    
    0 讨论(0)
  • 2020-12-07 13:06

    I've found that it only seems to work correctly if you apply the background to the root element of the list item.

    Also, consider using the new RecyclerView instead of a ListView

    List item view example:

    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/list_padding"
        android:layout_marginLeft="@dimen/list_padding"
        android:layout_marginRight="@dimen/list_padding"
        android:padding="@dimen/list_padding"
        android:background="@drawable/ripple_bg">
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Large Text"
            android:id="@+id/tvTitle"/>
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Small Text"
            android:id="@+id/tvSubtitle" />
    
    </RelativeLayout>
    
    0 讨论(0)
  • 2020-12-07 13:09

    As far as I can tell this bug is only in Android 5.0, not 5.1. The trick seems to be to use Drawable#setHotspot as a Google dev hints to here https://twitter.com/crafty/status/561768446149410816 (because obscure twitter hints are a great form of documentation!)

    Assume you have a row layout something like this

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
          <LinearLayout
                android:id="@+id/row_content"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                android:background="?attr/selectableItemBackground">
    
              .... content here .....
    
         </LinearLayout>
    
    </FrameLayout>
    

    The following worked for me

                row.setOnTouchListener(new View.OnTouchListener() {
                    @Override
                    public boolean onTouch(View v, MotionEvent event) {
                        v.findViewById(R.id.row_content)
                            .getBackground()
                            .setHotspot(event.getX(), event.getY());
    
                        return(false);
                    }
                });
    
    0 讨论(0)
  • 2020-12-07 13:14

    i adapted @ArhatBaid 's answer a littlebit, tested it and it works perfectly:

    <ripple xmlns:android="http://schemas.android.com/apk/res/android"
        android:color="?android:colorControlHighlight">
        <item android:drawable="@color/light_grey_header_navigation_drawer"/>
    </ripple>
    

    So, this allows you to set a background color and still have the ripple effect.
    for me target and minSdk are 21.

    0 讨论(0)
提交回复
热议问题