我有一个列表视图,每个项目包含2个视图(此ListView
看起来像GridView
有2列)。
我需要页眉和页脚,但它们在GridView
中不可用,所以我转向使用列表视图。
我想要一个选择器用于每个列表项的单独子视图,列表选择器不起作用,它将选择器应用于两个子视图。
到目前为止我尝试了什么????
我将每个元素的根视图设为FrameLayout
,并使用android:foreground="@drawable/some_selector"
属性,以便我可以模拟drawSelectorOnTop
属性。
我的问题:
如何仅将选择器应用于列表视图项中的被按下的子项。
列表视图布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ListView
android:id="@+id/episode_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="@android:color/black"
android:dividerHeight="5dp"
android:listSelector="@null"
android:descendantFocusability="afterDescendants" />
</RelativeLayout>
剧集项目
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"
android:foreground="@drawable/all_show_cell_background_selector" >
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/llEpisode"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#282828"
android:paddingBottom="5dp" >
<ImageView
android:id="@+id/episodeImage"
android:layout_width="160dp"
android:layout_height="90dp"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_gravity="center_vertical|center_horizontal"
android:adjustViewBounds="true"
android:contentDescription="@string/app_name"
android:scaleType="centerCrop"
android:src="@drawable/video_blank" />
<TextView
android:id="@+id/episodeDuration"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@id/episodeImage"
android:layout_alignLeft="@id/episodeImage"
android:background="@android:color/black"
android:gravity="right"
android:padding="2dp"
android:textColor="#FFFFFF"
android:textSize="11sp" />
<!-- android:textColor="#b5b4b4" -->
<TextView
android:layout_marginTop="2dp"
android:id="@+id/episodeTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/episodeImage"
android:gravity="right"
android:paddingRight="5dp"
android:singleLine="true"
android:text="hdgsagafasfsdafsdfsdfasddfsad"
android:textColor="#ffffff"
android:textSize="14sp" >
</TextView>
<TextView
android:id="@+id/showName"
android:layout_marginTop="2dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/episodeTitle"
android:clickable="true"
android:gravity="right"
android:paddingRight="5dp"
android:text="hdgsagafasfsdafsdfsdfasddfsad"
android:textColor="#A8A8A8"
android:textSize="13sp" >
</TextView>
<TextView
android:layout_marginTop="2dp"
android:id="@+id/noOfViewsText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_below="@+id/showName"
android:layout_alignParentBottom="true"
android:gravity="right"
android:paddingRight="5dp"
android:text="@string/number_of_views_text"
android:textColor="#A8A8A8"
android:textSize="11sp" />
<TextView
android:id="@+id/episodeNumberOfViews"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/noOfViewsText"
android:layout_toLeftOf="@+id/noOfViewsText"
android:layout_toRightOf="@+id/fav_img"
android:ellipsize="none"
android:gravity="right"
android:paddingRight="5dp"
android:singleLine="true"
android:text="fsdafasdfsad"
android:textColor="#A8A8A8"
android:textSize="11sp" />
<ImageView
android:id="@+id/fav_img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/episodeNumberOfViews"
android:layout_alignParentLeft="true"
android:layout_marginLeft="4dp"
android:contentDescription="@string/favourite_title_show"
android:src="@drawable/fav_episode" />
</RelativeLayout>
</FrameLayout>
单个列表项包含2个剧集项目
这是容纳2集项目的容器
<?xml version="1.0" encoding="utf-8"?>
<!-- This container to help emulate a GridView in each ListView item -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:descendantFocusability="afterDescendants"
android:orientation="horizontal" >
</LinearLayout>
答案 0 :(得分:4)
我不确定前景但我实际做的是使用listview。然后在适配器中我为列表中的每一行设置了两个相对布局,这是我的列表属性:
<ListView
android:id="@+id/seccion_list"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:divider="@null"
android:dividerHeight="0dp"/>
在我的适配器中我设置了每行加载的布局,这是行中第一帧的第一个相对布局:
<RelativeLayout
android:id="@+id/primerContenedor"
android:layout_width="wrap_content"
android:layout_height="@dimen/seccion_3_imagen_height"
android:layout_marginLeft="3dip"
android:layout_marginRight="3dip"
android:layout_marginTop="5dip"
android:layout_weight="1"
android:clickable="true"
android:focusable="true"
android:background="@drawable/layout_selector">
所以我所做的就是将相对布局的可点击和可聚焦属性设置为true并定义一个选择器:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true" android:drawable="@color/blue"/>
<item android:state_pressed="true" android:drawable="@color/blue"/>
<item android:drawable="@color/grey" />
</selector>
答案 1 :(得分:2)
为列表视图设置@android:listSelector="@null"
。然后为列表项的各个子视图设置选择器。
同时在列表项上设置android:descendantFocusability="afterDescendants"
并在剧集项目上设置android:duplicateParentState="false"
。
答案 2 :(得分:2)
我之前遇到过这个问题,并且对于示例代码
有一个很好的解决方案here答案 3 :(得分:0)
我假设您正在使用ListView适配器,在该适配器中,为左右布局提供两个具有不同ID的FrameLayouts的自定义布局。如果不是 - 这是一个解决方案。
在ListView适配器中,添加一个全局int selectedRowId = -1和short leftRight = -1(0表示左,1表示右)。在你的getView方法中,构造convertView时,检查postition == selectedRowId。如果是 - 请检查左边是0还是1,它会为您提供所选项目,您可以对其进行操作。 然后为每个FrameLayout添加一个onClickListener,其中根据选择存储selectedRowId = position,leftRight = 0或1,并调用notifyDataSetChanged()。