Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
yo_krevedko
5 / 5 / 2
Регистрация: 16.11.2013
Сообщений: 134
#1

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

15.02.2015, 22:24. Просмотров 1053. Ответов 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>
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.02.2015, 22:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Странное поведение swipe-to-dismiss RecyclerView (Программирование Android):

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

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

Advanced RecyclerView и Expandable RecyclerView - Программирование Android
Сделал expandable recycler view на основе advancedRecyclerView сборочки, но не важно это думаю, наследуется от обычного RecyclerView. ...

RecyclerView внутри recyclerView - Программирование Android
Добрый день. Хочу сделать список recyclerView c горизонтальной прокруткой, который отображает допустим 20 элементов(card). Т.е....

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

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

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

Добавлено через 5 минут
Походу так оно и есть, Вам нужно самим при успешном удалении элемента убирать его отрисовку из View.
yo_krevedko
5 / 5 / 2
Регистрация: 16.11.2013
Сообщений: 134
16.02.2015, 19:19  [ТС] #3
Nixy, так если я полностью удаляю разделители, то остаются пустые пробелы, просто с разделителями нагляднее
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
16.02.2015, 19:37 #4
Нет, я имею ввиду, когда вы удаляете элемент из списка вам нужно отследить удаление вашей фигуры, Ваш View этого не делает по какой-то причине. И покажите все таки, что будет если удалять из серединки.
yo_krevedko
5 / 5 / 2
Регистрация: 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() тоже пробовал, но к сожалению, это не дало результатов.
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
17.02.2015, 00:00 #6
А дайте посмотреть класс, где вы добавляете свой разделитель
yo_krevedko
5 / 5 / 2
Регистрация: 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);
          }
      }
}
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
17.02.2015, 08:20 #8
Нужно продебажить момент удаления и проверить идет ли вызов onDraw, идет ли вызов onDraw при вызове
Цитата Сообщение от yo_krevedko Посмотреть сообщение
Не могли бы Вы по-подробнее объяснить, что нужно сделать? Я пробовал делать

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

Swipe пример - Программирование Android
Дайте, пожалуйста пример простого кода для свайпа. Например провел пальцем по Имейдж вью влево- на текствью появилась надпись &quot;влево&quot;. ...

swipe в android 2.1 - Программирование Android
Подскажите как можно сделать переход по activity с помощью swipe для android 2.1? И можно ли вообще? Eclipse при создании проекта позволяет...

Swipe навигация в приложении - Программирование Android
Здравствуйте. Возникла потребность в навигации между активити жестами(свайп). Ведешь пальцем влево и переходит в нужное активити. ...

Swipe к TextView или Button - Программирование Android
Можно ли применить Swipe не конкретно для каждого активити, а к TextView, или, например, Button, чтобы когда проводишь справа налево по...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
17.02.2015, 08:20
Ответ Создать тему
Опции темы

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