Селектор в строке списка (swipe-listview) остается в нажатом состоянии после повторного создания экземпляра адаптера.

У меня есть список, и в макете строки есть дочерний элемент с фоном, установленным для следующего селектора:

<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>

And now this scenario happens:

  1. Я создаю экземпляр адаптера и устанавливаю его в список с базовым списком, скажем, моделью A (внутри ListFragment)
  2. Я нажимаю на первый ряд (это происходит и для другого ряда), и только при нажатии селектор остается в нажатом состоянии, показывая какой-то серый цвет, да!
  3. Я выбираю из меню какой-то элемент, и это вызывает: создание нового экземпляра адаптера с моделью списка B и применение его к списку.
  4. А теперь проблема: в первой строке селектор находится в нажатом состоянии

Дополнительная информация: @Вопросы, поднятые Абхишеком В. в комментарии: 1. Фон установлен на дочерний элемент макета строки, а не на сам макет строки, верно? Правильно! Вот макет, селектор установлен на относительный с идентификатором "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 listener is set to row layout or it's child? Child 3) Which listener you are using, is it onClick, onTouch or onItemClick? The listview is actually copied from the library android-swipelistview https://github.com/47deg/android-swipelistview . The click that does the damage is set as follows:

frontView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            swipeListView.onClickFrontView(downPosition);
        }
    });

и этот щелчок уведомляет этого слушателя

BaseSwipeListViewListener swipeListener = new BaseSwipeListViewListener() {
    @Override
    public void onClickFrontView(int position) {

    }//...

Спасибо!


person Misca    schedule 23.02.2015    source источник
comment
если вы покажете Adapter и XML Selector, может быть, мы что-нибудь поймаем   -  person hrskrs    schedule 25.02.2015
comment
Может не решить проблему, но пройтись по всем дочерним элементам и установить их состояние нажатия на false setPressed(false). Если он перерабатывает представления в списке, одно из них могло не получить эквивалент mouseUp до того, как оно потеряло фокус.   -  person Chris Handy    schedule 25.02.2015
comment
Можете ли вы дать нам дополнительную информацию - 1) Фон установлен на макет строки child, а не на сам макет строки, верно? 2) Прослушиватель кликов/прикосновений настроен на макет строки или дочерний? 3) Какой слушатель вы используете, это onClick, onTouch или onItemClick?   -  person Abhishek V    schedule 26.02.2015
comment
@Chris Я пробовал setPressed(false) для представления в getView() в адаптере, не сработало.   -  person Misca    schedule 26.02.2015
comment
@Abhishek V я обновлю информацию   -  person Misca    schedule 26.02.2015
comment
@Misca Проверьте мой ответ.   -  person Abhishek V    schedule 26.02.2015


Ответы (3)


О проблеме, с которой вы столкнулись, сообщалось здесь https://github.com/47deg/android-swipelistview/issues/41.

Согласно комментарию @strgev в этой ветке, исправление заключается в следующем:

отредактируйте класс SwipeListViewTouchListener, добавив следующую строку в метод onTouch:

....
case MotionEvent.ACTION_UP: {
view.onTouchEvent(motionEvent);
...

Вы можете попробовать это?

person Abhishek V    schedule 26.02.2015
comment
ОТЛИЧНЫЙ! Поздравляю с наградой! Большое тебе спасибо! :D - person Misca; 26.02.2015

Попробуйте с clearChoices и notifyDataSetChanged:

yourListView.clearChoices();
yourListView.getAdapter().notifyDataSetChanged();
person Juanjo Vega    schedule 23.02.2015
comment
спасибо, но это не сработало, у меня вообще есть selectionMode=none в списке - person Misca; 24.02.2015
comment
попробуй сделать один - person hrskrs; 25.02.2015

Это может быть проблема mutate. . Попробуйте программно присвоить фон строке, сначала вызвав mutate() в drawable.

Сначала получите экземпляр Drawable из своего пользовательского селектора-рисунка, затем вызовите для него mutate() и, наконец, назначьте рисуемый объект в качестве фона строки:

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