选择器,在列表视图 (swipe-listview) 行中,在 re-instanciating 适配器之后保持按下状态
Selector, in listview (swipe-listview) row, stays in state pressed after re-instanciating the adapter
我有一个列表视图,该行的布局有一个 child,背景设置为以下 select 或 :
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape android:shape="rectangle">
<solid android:color="@color/pressed_panel" />
<corners android:radius="@dimen/rounded_panel_corners" />
</shape>
</item>
<item>
<shape android:shape="rectangle">
<solid android:color="#ffffff" />
<corners android:radius="@dimen/rounded_panel_corners" />
</shape>
</item>
现在这种情况发生了:
- 我实例化适配器并将其设置为带有底层列表的列表视图,比方说模型 A(在 ListFragment 中)
- 我按下第一行(其他行也发生),只有在按下时,select或保持按下状态,显示一些灰色,呃!
- 我 select 从菜单中选择某个项目并触发:使用列表模型 B 创建适配器的新实例,并将其应用于列表视图。
- 现在的问题:第一行有select或处于按下状态
更多信息:
@Abhishek V 在评论中提出的问题:
1. 背景设置为行布局的 child 而不是行布局本身,对吧?正确的!这是布局,select或设置为id为"container_conversation"
的相对对象
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:descendantFocusability="blocksDescendants"
android:orientation="vertical">
<CheckBox
android:id="@+id/checkbox_select_row"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="18dp"
android:button="@drawable/checkbox_round_selector"
android:focusable="false"
android:clickable="true"
android:padding="8dp"/>
<FrameLayout
android:id="@+id/row"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:descendantFocusability="blocksDescendants"
android:orientation="vertical"
>
<RelativeLayout
android:id="@+id/back"
android:layout_width="wrap_content"
android:layout_height="82dp"
android:layout_gravity="right"
android:layout_marginBottom="4dp"
android:layout_marginRight="9dp"
android:layout_marginTop="4dp">
<SomeViews>
</RelativeLayout>
<FrameLayout
android:id="@+id/front"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:visibility="visible"
tools:visibility="visible">
<RelativeLayout
android:id="@+id/container_conversation"
android:layout_width="match_parent"
android:layout_height="82dp"
android:layout_marginBottom="4dp"
android:layout_marginLeft="9dp"
android:layout_marginRight="9dp"
android:layout_marginTop="4dp"
android:background="@drawable/white_rounded_panel">
<SomeViews>
</RelativeLayout>
<View
android:id="@+id/unread_indicator"
android:layout_width="8dp"
android:layout_height="8dp"
android:layout_gravity="center_vertical"
android:layout_marginLeft="5dp"
android:background="@drawable/orange_circle"
android:visibility="gone"
tools:visibility="visible" />
</FrameLayout>
</FrameLayout>
2) Click/touch 侦听器设置为行布局还是 child?
Child
3) 您使用的是哪个侦听器,是 onClick、onTouch 还是 onItemClick?
列表视图实际上是从库 android-swipelistview https://github.com/47deg/android-swipelistview 复制的。
造成伤害的点击设置如下:
frontView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
swipeListView.onClickFrontView(downPosition);
}
});
并且此点击会通知此侦听器
BaseSwipeListViewListener swipeListener = new BaseSwipeListViewListener() {
@Override
public void onClickFrontView(int position) {
}//...
谢谢!
试试 clearChoices
和 notifyDataSetChanged
:
yourListView.clearChoices();
yourListView.getAdapter().notifyDataSetChanged();
可能是mutate problem。尝试通过首先在可绘制对象上调用 mutate()
以编程方式将背景分配给行。
首先,从您的自定义选择器可绘制对象中获取一个 Drawable
实例,然后对其调用 mutate()
,最后将可绘制对象指定为行的背景:
Drawable selector = getResources().getDrawable(R.drawable.your_selector)
selector.mutate();
//...
row.setBackground(selector);
您遇到的问题已在此处报告 https://github.com/47deg/android-swipelistview/issues/41。
根据@strgev 在该线程中的说明,解决方法是 -
编辑 class SwipeListViewTouchListener
通过将以下行添加到 onTouch 方法:
....
case MotionEvent.ACTION_UP: {
view.onTouchEvent(motionEvent);
...
你能试试吗?
我有一个列表视图,该行的布局有一个 child,背景设置为以下 select 或 :
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape android:shape="rectangle">
<solid android:color="@color/pressed_panel" />
<corners android:radius="@dimen/rounded_panel_corners" />
</shape>
</item>
<item>
<shape android:shape="rectangle">
<solid android:color="#ffffff" />
<corners android:radius="@dimen/rounded_panel_corners" />
</shape>
</item>
现在这种情况发生了:
- 我实例化适配器并将其设置为带有底层列表的列表视图,比方说模型 A(在 ListFragment 中)
- 我按下第一行(其他行也发生),只有在按下时,select或保持按下状态,显示一些灰色,呃!
- 我 select 从菜单中选择某个项目并触发:使用列表模型 B 创建适配器的新实例,并将其应用于列表视图。
- 现在的问题:第一行有select或处于按下状态
更多信息: @Abhishek V 在评论中提出的问题: 1. 背景设置为行布局的 child 而不是行布局本身,对吧?正确的!这是布局,select或设置为id为"container_conversation"
的相对对象<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:descendantFocusability="blocksDescendants"
android:orientation="vertical">
<CheckBox
android:id="@+id/checkbox_select_row"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="18dp"
android:button="@drawable/checkbox_round_selector"
android:focusable="false"
android:clickable="true"
android:padding="8dp"/>
<FrameLayout
android:id="@+id/row"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:descendantFocusability="blocksDescendants"
android:orientation="vertical"
>
<RelativeLayout
android:id="@+id/back"
android:layout_width="wrap_content"
android:layout_height="82dp"
android:layout_gravity="right"
android:layout_marginBottom="4dp"
android:layout_marginRight="9dp"
android:layout_marginTop="4dp">
<SomeViews>
</RelativeLayout>
<FrameLayout
android:id="@+id/front"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:visibility="visible"
tools:visibility="visible">
<RelativeLayout
android:id="@+id/container_conversation"
android:layout_width="match_parent"
android:layout_height="82dp"
android:layout_marginBottom="4dp"
android:layout_marginLeft="9dp"
android:layout_marginRight="9dp"
android:layout_marginTop="4dp"
android:background="@drawable/white_rounded_panel">
<SomeViews>
</RelativeLayout>
<View
android:id="@+id/unread_indicator"
android:layout_width="8dp"
android:layout_height="8dp"
android:layout_gravity="center_vertical"
android:layout_marginLeft="5dp"
android:background="@drawable/orange_circle"
android:visibility="gone"
tools:visibility="visible" />
</FrameLayout>
</FrameLayout>
2) Click/touch 侦听器设置为行布局还是 child? Child 3) 您使用的是哪个侦听器,是 onClick、onTouch 还是 onItemClick? 列表视图实际上是从库 android-swipelistview https://github.com/47deg/android-swipelistview 复制的。 造成伤害的点击设置如下:
frontView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
swipeListView.onClickFrontView(downPosition);
}
});
并且此点击会通知此侦听器
BaseSwipeListViewListener swipeListener = new BaseSwipeListViewListener() {
@Override
public void onClickFrontView(int position) {
}//...
谢谢!
试试 clearChoices
和 notifyDataSetChanged
:
yourListView.clearChoices();
yourListView.getAdapter().notifyDataSetChanged();
可能是mutate problem。尝试通过首先在可绘制对象上调用 mutate()
以编程方式将背景分配给行。
首先,从您的自定义选择器可绘制对象中获取一个 Drawable
实例,然后对其调用 mutate()
,最后将可绘制对象指定为行的背景:
Drawable selector = getResources().getDrawable(R.drawable.your_selector)
selector.mutate();
//...
row.setBackground(selector);
您遇到的问题已在此处报告 https://github.com/47deg/android-swipelistview/issues/41。
根据@strgev 在该线程中的说明,解决方法是 -
编辑 class SwipeListViewTouchListener
通过将以下行添加到 onTouch 方法:
....
case MotionEvent.ACTION_UP: {
view.onTouchEvent(motionEvent);
...
你能试试吗?