选择器,在列表视图 (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>

现在这种情况发生了:

  1. 我实例化适配器并将其设置为带有底层列表的列表视图,比方说模型 A(在 ListFragment 中)
  2. 我按下第一行(其他行也发生),只有在按下时,select或保持按下状态,显示一些灰色,呃!
  3. 我 select 从菜单中选择某个项目并触发:使用列表模型 B 创建适配器的新实例,并将其应用于列表视图。
  4. 现在的问题:第一行有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) {

    }//...

谢谢!

试试 clearChoicesnotifyDataSetChanged:

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);
...

你能试试吗?