Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: RecyclerView с выделением элементов

Вопрос может нубский, но нужен ответ

Есть необходимость сделать multi selectable RecyclerView адаптер.

Сделал по примеру

но тут для выхода из режима selectable нужно нажимать на кнопочку в actionMenu(и вообще по примеру, нужно выводить actionMenu, мне он не нужен).

Вопрос:
1. Как реализовать (или переделать этот пример) так чтобы долгое нажатие начинает выделение, а если убираем выделение со всех элементов то выходим из режима selectable.
2. при однократном клике выполнять какой то код (в этом примере как я понял если вешать клик листенер то перестает работать selectable) - (может неправильно понял)

Добавлено через 52 минуты
Не знаю как по умному это делают разработчики.

Я сделал так(дополнил пример из хабра):

В адаптере
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
    @Override
    public void onSelectedChanged(RecyclerView.ViewHolder holder, boolean isSelected) {
        ((CustomViewHolder) holder).timingCheckable.setChecked(isSelected);
 
        if (getSelectionHelper().isSelectable() && getSelectionHelper().getSelectedItemsCount() == 0){
            getSelectionHelper().setSelectable(false);
        }
    }
 
public void deleteSelectsItems(){
 
        if (getItemCount() != 0){
            Iterator iterator = dataFiltered.iterator();
            int i = 0;
            while (iterator.hasNext()){
                PzhdWorkSchedule data = (PzhdWorkSchedule) iterator.next();
                if (getSelectionHelper().isItemSelected(i)){
                    iterator.remove();
                }
                i++;
            }
        }
        getSelectionHelper().setSelectable(false);
        notifyDataSetChanged();
    }
Ответ: что значит замусоривать модель данных...
эта модель как раз и предназначается для правильного показа айтемов

в такой ситуации или когда надо добавить каких-то красивостей при показе я лично вообще делаю отдельный класс, типа wrapper для модели данных и уже там добавляю все поля из которых потом холдеры будут читать значения и показывать айтемы как требуется

дополнительного кода никакого вообще нет, просто еще один класс wrapper
на котлине это вообще одна строка, типа такого

data class Wrapper(val model: YourClass, val isSelected : Boolean = false) ну и еще любые поля какие надо там под задачу
и все - в адаптер скармливаем не List<YourClass>, а List<Wrapper>

в итоге получаем полный контроль над показом холдеров, хоть в радугу их можно красить через одного, главное что бы у враппера были все нужные поля - флаги
Вопрос: Как реализовать выделение элементов таблицы

Уважаемые знатоки, нужна ваша помощь
Имеется таблица, созданная с помощью GridLayout, элементами которой являются ImageView.
Кликните здесь для просмотра всего текста

После реализации View.OnClickListener и регистрации слушателей для этих ImageView на них срабатывают нажатия. Но они за одно нажатие срабатывают только на одном элементе. А мне нужно за одно нажатие выделить несколько элементов (как в игре балда, когда надо выделить слово).

Как это можно реализовать?
Ответ: Таблица ведь без скрола? Если да - можно сам GridLayout повесить OnTouch листенер и в ивенте MOVE брать координаты касания, а потом по ним искать картинку и вызывать у нее какой-нибудь метод, который ее перекрасит.
Вопрос: Как определить что элемент recyclerview пересекает при перемещении регион кнопки

У меня есть recyclerview а внизу экрана есть кнопка. На recyclerview повешен TouchListener и у него есть метод public boolean onTouch(View v, MotionEvent event) в котором определяются события перетаскивания ну типа как здесь
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
 photoList.setLayoutManager(mLayoutManager);
        photoList.setAdapter(adapter);
       // photoList.setOnDragListener(this);
        adapter.update(photo);
        setRecyclerViewListener();
        final Rect rect;
        final int top = getActivity().findViewById(R.id.trash_can).getTop();
        rect = new Rect(getActivity().findViewById(R.id.trash_can).getLeft(), getActivity().findViewById(R.id.trash_can).getTop(), getActivity().findViewById(R.id.trash_can).getRight(),getActivity().findViewById(R.id.trash_can).getBottom());
        photoList.setOnTouchListener(new View.OnTouchListener() {
 
 
            @Override
            public boolean onTouch(View v, MotionEvent event) {
 
                if(event.getAction() == MotionEvent.ACTION_DOWN){
                    
 
                }
                if(event.getAction() == MotionEvent.ACTION_MOVE){
                    
 
                    }
                }
                return false;
            }
        });
и вот я хочу определить момент когда перетаскиваемый элемент списка пересечет границы кнопки, которая внизу экрана и в этот момент например поменять цвет кнопки. Как это сделать? Как здесь расчитать координаты, ну этот момент?

Добавлено через 6 минут
То есть определить когда перетаскиваемый item recyclerview пересечет регион кнопки
Ответ: спасибо

Добавлено через 23 часа 37 минут
Еще такой вопрос. Как показано на скрине выше, картинка, когда мы ее перетаскиваем на кнопку,накладывается на эту кнопку сверху. А у меня в разметке получается, что кнопка накладывается на recyclerview и поэтому картинка при перетаскивании через кнопку проходит как бы под кнопкой, а должна над этой кнопкой. Как такое можно реализовать?
Вопрос: Как развернуть RecyclerView

Делаю свой месседжер и столкнулся с проблемой, как развернуть RecyclerView (на подобии сообщений в ВК)
у меня есть идея, вставлять элементы на 0е место, но не могу найти как это сделать.
Ответ:
Сообщение от kair32
вставлять элементы на 0е место
0-е это сверху) тебе , если я правельно понял нужно снизу/ по этому его нужно развернутЬ это делается так:
XML
1
2
3
4
5
<android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/recyclerView" 
        android.support.v7.recyclerview:stackFromEnd ="true"/>
или так
Java
1
2
3
mLayoutManager = new LinearLayoutManager(getActivity());
mLayoutManager.setReverseLayout(true);
mLayoutManager.setStackFromEnd(true);
далее, чтоб добавить в нужную позицию, просто делаем так
Java
1
2
mArrayList.add(position, item);
notifyItemInserted(position);
где mArrayList это массив в адаптере

Добавлено через 48 секунд
и да. мысль изложена кривовато
Вопрос: Загрузка изображений в RecyclerView

Здравствуйте, каким образом можно динамически загружать картинки в RecyclerView из интернета, чтобы все это дело не тормозило и было более менее плавно?
Допустим у меня есть ячейки с названием автомобилей, мне нужно взять готовые изображения на сервере и вставить их в RecyclerView.
Ответ: Ничего не поменялось.
Вот допустим у меня 11 элементов. Все видимые элементы загружаются хорошо и когда я скролю в пределах 5-ти видимых элементов все нормально, они не перерисовываются. Но когда начинаю скролить в конец списка или же просто быстро скролить туда-сюда, то становится заметно как картинки начинают перерисовываться с довольно ощутимой задержкой. Как сделать так, чтобы загруженные изображения не перерисовывались?

Добавлено через 1 час 4 минуты
Проблема была в том, что я не учел проверку на image.getDrawable()!=null, поэтому изображения каждый раз перезагружались, даже если до этого уже были загружены.
Тему можно закрыть
Вопрос: Динамическая смена макета RecyclerView

Добрый день!

Есть Activity с ViewPager из 2 страниц (фрагмент один). В фрагмент, в зависимости от номера страницы, вставляется список RecyclerView, в каждом элементе которого есть изображение. Удерживая изображение можно менять порядок расположения элементов.

В меню есть пункт "Delete". Задумка такая: по нажатию Delete из меню, изображения для перетаскивания элементов заменяются изображениями для удаления (крестик, например). С какой стороны подходить к решению данного вопроса пока не очень понимаю.

1) возможно ли динамически менять адаптер? Тогда через него загружать разметку с кнопкой удаления.
2) разместить на макете сразу оба изображения и одно из них изначально скрыть, а потом менять их видимость. Но тут не очень понимаю как ее менять, ведь обработка нажатий на кнопки меню в Activity, а адаптер во фрагменте.

В общем заранее благодарен за возможные идеи
Ответ:

Не по теме:

ну я просто подтвердил слова :)

Сообщение от Hugonavy
Или слишком тупая?
я щас не конкретно про эту тему, но
не буду скрывать, что меня тригерит каждый раз когда приходится людям объяснять что recyclerview чуть ли не самый универсальный виджет
на нем практически все что угодно можно вымостить, надо просто немного времени потратить на изучение

Вопрос: RecyclerView сохранения в JSON

У меня есть recyclerview (в фрагменте) и фрагмент с детальной информацией к одному из элементов. Все бы хорошо, но когда мои данные сохраняються. У меня плохой результат в моей JSON файл. Все время, когда я открыть элемент списка или редагирую, он добавиляеться как новый элемент в JSON файл, в то время как он должен переписать прежнее значения.
Вот код ObjectJSON:
Java(TM) 2 Platform Standard Edition 5.0
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
public class ObjectJSON {
    private Context mContext;
    private String mFilename;
 
 
    public ObjectJSON(Context context, String filename) {
        mContext = context;
        mFilename = filename;
    }
 
    public void saveReminders(ArrayList<Object> objects) throws JSONException, IOException {
        Log.i("Save","saveReminders");
        JSONArray array = new JSONArray();
        for (Object f : objects)
            array.put(f.toJSON());
 
        Writer writer = null;
        try {
            OutputStream out = mContext.openFileOutput(mFilename, Context.MODE_APPEND);
            writer = new OutputStreamWriter(out);
            writer.write(array.toString());
        } finally {
            if (writer != null)
                writer.close();
        }
    }
 
    public ArrayList<Object> loadReminders() throws IOException, JSONException {
        Log.i("Save","loadReminders");
        ArrayList<Object> objects = new ArrayList<Object>();
        BufferedReader reader = null;
        try {
            InputStream in = mContext.openFileInput(mFilename);
            reader = new BufferedReader(new InputStreamReader(in));
            StringBuilder jsonString = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                jsonString.append(line);
            }
 
            JSONArray array = (JSONArray) new JSONTokener(jsonString.toString())
                    .nextValue();
            for (int i = 0; i < array.length(); i++) {
                objects.add(new Object(array.getJSONObject(i)));
            }
        } catch (FileNotFoundException e) {
        //when 0
        } finally {
            if (reader != null)
                reader.close();
        }
        return objects;
    }
}
Вот как оно мне делает

Если это ошибка написания могу предоставить. Или могу сюда остальное закинуть.
Подскажите пожалуйста в чем проблема?
Ответ:
Сообщение от TheCollapse
Все время, когда я открыть элемент списка или редагирую, он добавиляеться как новый элемент в JSON файл, в то время как он должен переписать прежнее значения.
Дык, Context.MODE_APPEND же ж...


Короче, руби его топором в начале

Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
 Writer writer = null;
        try {
            mContext.deleteFile(mFilename);
            OutputStream out = mContext.openFileOutput(mFilename, Context.MODE_APPEND);
            writer = new OutputStreamWriter(out);
            writer.write(array.toString());
        } finally {
            if (writer != null)
                writer.close();
        }
Вопрос: Принцип работы RecyclerView

Можете объяснить принципп работы RecyclerView во время скроллинга? Как он заполняется элементами? Сколько элементов находится в каждый момент времени в этом виджете при скроллинге? Какой максимальный объем буфера этого виджета?
Ответ: danek130995, за то что бы использовать то что есть заново отвечает вроде LayoutManager. использовать то что создано в нескольких элементах можно только в значении этой фразы "использовать элемент уходящий с экрана для отображения элемента приходящего на экран (переиспользование)". утечки тут ни при чем. Holder как таковой не дарует нам бесконечный объем буфера. его дарует сам RV

Добавлено через 43 секунды

Вопрос: Пример fragments and RecyclerView

может кто-то показать пример проекта как на фото, с 2 активити, и 2 фрагментами, слева список RecyclerView а справа какая-то инфа, при нажатии на пунк в списке, отображалась инфа справа, огромная просьба не отправлять на ссылки где что-то вроде, слева кнопка а справа инфа, нужно именно с нажатием на итем в RecyclerView
Ответ: если делать так как на вашем левом рисунке, при нажатии на элемент ресайклера, должен передаваться колбек родительскому элементу, он должен открывать новый фрагмент, в контейнере который справа, и передавать ему нужную информацию через ньюинстанс
Вопрос: Как настроить RecyclerView ?

При загрузке с сети информации в RecyclerView помещается по 100 элементов, сделал так что при достижении конца списка загружается еще 100 и так далее.

Но при добавлении новых записей список автоматично сбрасывается на начало списка. А мне нужно чтоб он оставался на месте, и записи просто добавлялись, но ничего со списком не происходило!

Вопрос:
Как сделать так, чтоб RecyclerView открывался в заданной позиции (ну или при изменении не бежал в начало )?
Ответ:
Сообщение от prokopov
Как сделать так, чтоб RecyclerView открывался в заданной позиции (ну или при изменении не бежал в начало )?
так он и не бежит в начало, скорее всего вы вместо того что бы добавить данные и обновить адаптер, создаете новый адаптер