列表视图(swipe-listview)行中的选择器在重新安装适配器后保持按下状态

时间:2015-02-23 14:54:50

标签: android android-listview android-selector

我有一个列表视图,行的布局有一个子,背景设置为以下选择器:

<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. 我实例化适配器并将其设置为listview,带有基础列表,假设模型A(在ListFragment中)
  2. 我按下第一行(也发生在其他行上),只有按下时,选择器才会处于按下状态,显示出一些灰色,呃!
  3. 我从菜单中选择一个项目并触发:使用列表模型B创建适配器的新实例,并将其应用于列表视图。
  4. 现在问题:第一行让选择器处于按下状态

  5. 更多信息: @ Abhishek V在评论中提出的问题: 1.背景设置为行布局的子项而不是行布局本身对吗?对!这是布局,选择器设置为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)点击/触摸监听器设置为行布局还是它​​的孩子? 儿童 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) {
    
        }//...
    

    谢谢!

3 个答案:

答案 0 :(得分:0)

尝试使用clearChoicesnotifyDataSetChanged

yourListView.clearChoices();
yourListView.getAdapter().notifyDataSetChanged();

答案 1 :(得分:0)

可能是mutate problem。尝试通过首先在drawable上调用mutate()以编程方式将背景分配给行。

首先,从自定义selector-drawable中获取Drawable实例,然后在其上调用mutate(),最后将drawable分配为行的背景:

Drawable selector = getResources().getDrawable(R.drawable.your_selector)
selector.mutate();
//...
row.setBackground(selector);

答案 2 :(得分:0)

您在此处遇到的问题已在https://github.com/47deg/android-swipelistview/issues/41报告。

根据@strgev在该主题中的讨论,修复是 -

通过在onTouch方法中添加以下行来编辑类SwipeListViewTouchListener

....
case MotionEvent.ACTION_UP: {
view.onTouchEvent(motionEvent);
...
你能试试吗?