Совместное использование списка элементов в программе recyclerViews

Я создал вложенный RecyclerView как это (это вертикаль RecyclerView и его дочерние взгляды TextView для заголовка раздела и горизонтального RecyclerView для списка предметов).

Некоторые предметы могут быть в 2 (или более) горизонтальных RecyclerView в то же время, и я хочу синхронизировать тему (поэтому, если что-то изменится в одном из них, другие тоже узнают об этом).

Как я могу этого достичь?

4 ответа

Это больше похоже на проблему со структурой данных, чем на проблему с RecyclerView, Я бы предложил сохранить HashMap элементов, которые вы заполняете в своих горизонтальных списках.

Поэтому, когда элемент списка изменяется (например, элемент отмечен как избранный), просто измените значение в HashMap от истинного к ложному и наоборот.

Тогда позвони notifyDatasetChanged() на вашем адаптере, чтобы отразить изменения в ваших горизонтальных списках.

Надеюсь, это поможет.

Я полагаю, вы получаете List из Lists из сети или какой-либо базы данных, и те же элементы в разных горизонтальных списках будут иметь некоторый общий идентификатор, такой как id или же primary key,

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

Если вы не хотите унифицировать модели данных RecyclerViews, вы можете использовать LocalBroadcastReceiver. Каждый RecyclerView должен установить себя в качестве наблюдателя, и при необходимости вы можете уведомлять о любых изменениях в одном RecyclerView и делать то, что вы хотите в других RecyclerView.

Я не проверял этот код, и это своего рода псевдо-код, также не уверен, что это хорошее решение, но хочу попытаться указать правильное направление. Может быть, вы найдете что-то полезное. Игнорировать плохое наименование..

Создайте интерфейс, который реализует все вложенное представление рециркулятора, который выполняет фактическую прокрутку.

public interface ScrollListener {
        void update(int scrollOffset);
}

реализовать во вложенных представлениях переработчика

public class NestedRecyclerViewFragment implements NestedScrollListener {

        RecyclerView mRecyclerView;

        @Override
        public onCreate(Bundle savedInstance) {
            mRecyclerView.addOnScrollListener { 
                public onScroll(int xOffset, int yOffset) {
                   if (getActivity() instanceof OnNestedRecyclerViewScrollListener) {
                        ((OnNestedRecyclerViewScrollListener) getActivity()).onNestedScroll(xOffset);
                    }
                }
            }
        }
        ....

        @Override
        protected void update(int scrollOffset) {
            mRecyclerView.scrollTo(scrollOffset, 0);
        }

        ....
}

Тогда у вас может быть этот другой интерфейс, который реализует родитель.

public interface OnNestedRecyclerViewScrollListener {
        void onNestedScroll(int scrollOffset);
}

Который имеет вложенные виды переработчика.

public class ParentFragment implements OnNestedRecyclerViewScrollListener {

           Adapter nestedRecyclerViewAdapter;

            ....

            @Override
            protected void onNestedScroll(int scrollOffset) {
                for (int i = 0; i < nestedRecyclerViewAdapter.getItemCount(); i++) {
                    RecyclerView recyclerView = nestedRecyclerViewAdapter.getItemAt(i);
                    if (recyclerView instanceof NestedScrollListener) {
                        ((NestedScrollListener) recyclerView).update(scrollOffset);
                    }
                }
            }

            ....
    }

Примечание. Может быть плохо постоянно повторять элементы в адаптере, но это может указывать вам правильное направление

Другие вопросы по тегам