Совместное использование списка элементов в программе recyclerViews
Я создал вложенный RecyclerView
как это (это вертикаль RecyclerView
и его дочерние взгляды TextView
для заголовка раздела и горизонтального RecyclerView
для списка предметов).
Некоторые предметы могут быть в 2 (или более) горизонтальных RecyclerView
в то же время, и я хочу синхронизировать тему (поэтому, если что-то изменится в одном из них, другие тоже узнают об этом).
Как я могу этого достичь?
4 ответа
Это больше похоже на проблему со структурой данных, чем на проблему с RecyclerView
, Я бы предложил сохранить HashMap
элементов, которые вы заполняете в своих горизонтальных списках.
Поэтому, когда элемент списка изменяется (например, элемент отмечен как избранный), просто измените значение в HashMap
от истинного к ложному и наоборот.
Тогда позвони notifyDatasetChanged()
на вашем адаптере, чтобы отразить изменения в ваших горизонтальных списках.
Надеюсь, это поможет.
Я полагаю, вы получаете List
из List
s из сети или какой-либо базы данных, и те же элементы в разных горизонтальных списках будут иметь некоторый общий идентификатор, такой как 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);
}
}
}
....
}
Примечание. Может быть плохо постоянно повторять элементы в адаптере, но это может указывать вам правильное направление