Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
yo_krevedko
5 / 5 / 4
Регистрация: 16.11.2013
Сообщений: 134
1

Странное поведение swipe-to-dismiss RecyclerView

15.02.2015, 22:24. Просмотров 1248. Ответов 7
Метки нет (Все метки)

После удаления свайпом элемента списка остаётся небольшой пробе между элементами, сложно объяснить, поэтому вот ссылка на то, что происходит: http://i.imgur.com/v1D149C.gif
Когда элемент списка смахивается свайпом, появляется alertdialog, который предлагает подтвердить удаление. Если нажать Cancel, что-то странное происходит и элементы начинают удаляться так, как видно на анимации. Если не нажимать Cancel, всё работает отлично. Не пойму, в чем проблема.

Вот код:
MainActivity.java http://pastebin.com/AUdLCHjs
XML-файлы, собранные в один: http://pastebin.com/Cf95zv6f

Также, я использую дополнительные библиотеки:
SwipeableRecyclerView: https://github.com/krossovochkin/And...hListener.java
ListItemDivider: https://gist.github.com/polbins/e37206fbc444207c0e92

В SwipeableRecyclerView я делал некоторые изменения примерно между 172 и 280 строками (в case MotionEvent.ACTION_UP), скорее всего там и происходит что-то непонятное.
Надеюсь, найдётся человек, который разбирается в том, почему такое может происходить

Добавлено через 9 минут
В частности, изменения в SwipeableRecyclerView состоят в изменении анимации влево-вправо, чтобы при вызове alertdialog и нажатия Cancel, элемент списка плавно возвращался на своё место

Добавлено через 15 минут
Есть подозрения, что проблема в файле, отобаржающем отдельный элемент RecyclerView custom_row.xml
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="horizontal"
   android:layout_width="match_parent"
   android:layout_height="51dp"
   android:layout_marginTop="3dp"
   android:layout_marginBottom="3dp">
 
 
    <TextView
       android:id="@+id/text_with_icon"
       android:layout_width="41dp"
       android:layout_height="41dp"
       android:layout_alignParentLeft="true"
       android:layout_alignParentStart="true"
       android:layout_alignParentTop="true"
       android:layout_gravity="center_vertical"
       android:layout_marginLeft="18dp"
       android:layout_marginStart="18dp"
       android:layout_marginRight="18dp"
       android:layout_marginTop="5dp"
       android:background="@drawable/circle"
       android:gravity="center"
       android:textAllCaps="true"
       android:text="a"
       android:textColor="#fff"
       android:textSize="22sp" />
 
    <LinearLayout
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_centerInParent="true"
       android:gravity="center_vertical"
       android:layout_toRightOf="@+id/text_with_icon"
       android:orientation="vertical" >
 
        <TextView
           android:id="@+id/list_title"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:paddingLeft="0dp"
           android:paddingTop="3dp"
           android:paddingBottom="3dp"
           android:text="Dummy text"
           android:textColor="#000"
           android:textSize="16sp"
           android:textStyle="bold" />
 
        <TextView
           android:id="@+id/description"
           android:layout_width="wrap_content"
           android:layout_height="14dp"
           android:text="Lorem ipsum dolor sit amet, consectetur..."
           android:textColor="#000"
           android:visibility="visible"
           android:textSize="12sp"
           android:textStyle="normal" />
    </LinearLayout>
</RelativeLayout>
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.02.2015, 22:24
Ответы с готовыми решениями:

Странное поведение RecyclerView во фрагменте
Здравствуйте, возникла проблема с обновлением RecyclerView, точнее при создание...

Поведение RecyclerView при удалении элементов
Здравствуйте! Есть RecyclerView, который подгружается новыми данными, когда...

Advanced RecyclerView и Expandable RecyclerView
Сделал expandable recycler view на основе advancedRecyclerView сборочки, но не...

Закрыть диалог во время выполнения процесса (принудительное срабатывание dismiss()
Всем привет! В приложении есть диалоговое окно с кнопкой, по нажатию которой...

RecyclerView внутри recyclerView
Добрый день. Хочу сделать список recyclerView c горизонтальной прокруткой,...

7
Nixy
ComfyMobile
400 / 281 / 34
Регистрация: 24.07.2012
Сообщений: 916
16.02.2015, 16:14 2
Такое ощущение, что это остаются ваши Shape разделители. Если удалять начать с середины так, чтоб остались 1 и последний элементы также будет?

Добавлено через 5 минут
Походу так оно и есть, Вам нужно самим при успешном удалении элемента убирать его отрисовку из View.
0
yo_krevedko
5 / 5 / 4
Регистрация: 16.11.2013
Сообщений: 134
16.02.2015, 19:19  [ТС] 3
Nixy, так если я полностью удаляю разделители, то остаются пустые пробелы, просто с разделителями нагляднее
0
Nixy
ComfyMobile
400 / 281 / 34
Регистрация: 24.07.2012
Сообщений: 916
16.02.2015, 19:37 4
Нет, я имею ввиду, когда вы удаляете элемент из списка вам нужно отследить удаление вашей фигуры, Ваш View этого не делает по какой-то причине. И покажите все таки, что будет если удалять из серединки.
0
yo_krevedko
5 / 5 / 4
Регистрация: 16.11.2013
Сообщений: 134
16.02.2015, 21:26  [ТС] 5
Nixy, да, если начать удалять с любого места, включая середину, происходит то же самое.
вот тут я выделил места, где я пробовал вносить изменения (добавлять анимацию движения элемента обратно на место в случае dismiss или cancel): http://pastebin.com/NDACaGE8
Может быть так, что тут зарыта проблема?

Добавлено через 3 минуты
Цитата Сообщение от Nixy Посмотреть сообщение
Вам нужно самим при успешном удалении элемента убирать его отрисовку из View.
Не могли бы Вы по-подробнее объяснить, что нужно сделать? Я пробовал делать
Java
1
mRecyclerView.InvalidateItemDeccorations();
, да и другие Ivalidate() тоже пробовал, но к сожалению, это не дало результатов.
0
Nixy
ComfyMobile
400 / 281 / 34
Регистрация: 24.07.2012
Сообщений: 916
17.02.2015, 00:00 6
А дайте посмотреть класс, где вы добавляете свой разделитель
0
yo_krevedko
5 / 5 / 4
Регистрация: 16.11.2013
Сообщений: 134
17.02.2015, 00:32  [ТС] 7
Nixy, Вот такой код в главном активити:
Java
1
recyclerView.addItemDecoration(new SimpleDividerItemDecoration(getApplicationContext()));
А вот сам код класса разделителя:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class SimpleDividerItemDecoration extends RecyclerView.ItemDecoration {
      private Drawable mDivider;
 
      public SimpleDividerItemDecoration(Context context) {
          mDivider = context.getResources().getDrawable(R.drawable.line_divider);
}
 
      @Override
      public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
          int left = parent.getPaddingLeft();
          int right = parent.getWidth() - parent.getPaddingRight();
 
          int childCount = parent.getChildCount();
          for (int i = 0; i < childCount; i++) {
               View child = parent.getChildAt(i);
 
               RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
 
               int top = child.getBottom() + params.bottomMargin;
               int bottom = top + mDivider.getIntrinsicHeight();
 
               mDivider.setBounds(left, top, right, bottom);
               mDivider.draw(c);
          }
      }
}
0
Nixy
ComfyMobile
400 / 281 / 34
Регистрация: 24.07.2012
Сообщений: 916
17.02.2015, 08:20 8
Нужно продебажить момент удаления и проверить идет ли вызов onDraw, идет ли вызов onDraw при вызове
Цитата Сообщение от yo_krevedko Посмотреть сообщение
Не могли бы Вы по-подробнее объяснить, что нужно сделать? Я пробовал делать

Java
1
mRecyclerView.InvalidateItemDeccorations();
, да и другие Ivalidate() тоже пробовал, но к сожалению, это не дало результатов.
Если ничего не поможет, то можно поставить костыль, это нарисовать разделитель на layout элемента списка.
0
17.02.2015, 08:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.02.2015, 08:20

swipe в android 2.1
Подскажите как можно сделать переход по activity с помощью swipe для android...

Swipe переключение
Всем привет! Решил реализовать swipe-листание,но ничего не получается. все...

Swipe пример
Дайте, пожалуйста пример простого кода для свайпа. Например провел пальцем по...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru