Как сделать RecyclerView с навигацией в глубину?

124
11 сентября 2019, 15:10

Вот пример из приложения McDonalds, где в фрагменте "Меню" есть RecyclerView, при нажатии на любой элемент которого появляется точно такой же RecyclerView (только с измененным наполнением, которое зависит от выбранного элемента),и при следующем нажатии это снова повторяется. Как можно реализовать точно такую же навигацию? (и как передавать данные о выбранной кнопке в такой сложной структуре) Кто уже сталкивался с этим?

Answer 1

Можно сделать с помощью стека и адаптеров, если у вас адаптеры с разными моделями данных. Например, у меня будет экран с глубиной три. Первый уровень - это FirstAdapter с моделью FoodListModel. Второй уровень - это SecondAdapter с моделью FoodTypeModel. Третий уровень - это ThirdAdapter с моделью FoodModel.

Делаем интерфейс-коллбэк, который может принимать любой объект.

public interface OnItemClickListener<T> {
    void onClick(T t);
}

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

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

public class MainActivity extends AppCompatActivity implements OnItemClickListener{
    private RecyclerView rv;
    private RecyclerView.Adapter myAdapter;
    private Stack<RecyclerView.Adapter> adapterStack = new Stack<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        rv = findViewById(R.id.rv);
        rv.setLayoutManager(new LinearLayoutManager(this));
        myAdapter = new FirstAdapter(this);
        rv.setAdapter(myAdapter);
    }
    @Override
    public void onClick(Object o) {
        adapterStack.push(myAdapter);
        if(o instanceof FoodListModel) {
           //тут можно подгрузить данные и положить в адаптер
           myAdapter = new SecondAdapter(this);
        }
        if(o instanceof FoodTypeModel) {
           //тут можно подгрузить данные и положить в адаптер
           myAdapter = new ThirdAdapter(this)
        };
        if(o instanceof FoodModel) {
           //можно стартануть активити с покупкой
        };
        rv.setAdapter(myAdapter);
    }
    @Override
    public void onBackPressed() {
        if(!adapterStack.isEmpty()) {
            myAdapter = adapterStack.pop();
            rv.setAdapter(myAdapter);
        }else{ //если пустой стек значит мы на первом списке и можно выйти с экрана
            super.onBackPressed();
        }
    }
}

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

READ ALSO
Не могу вызвать метод из контроллера

Не могу вызвать метод из контроллера

Пишу приложение используя JavaFX, работаю с таблицами, хочу вызвать метод в контроллере, который написан в Main, но почему-то не вижу егоДля большего...

150
Выход за границы поля TextField

Выход за границы поля TextField

Как можно сделать перенос текста на следующую строку при вводе? (Когда текст доходит к границе поля,он как бы начинает двигать его,скрывая...

144
В чем фишка ServletConfig?

В чем фишка ServletConfig?

В чем фишка ServletConfig? Да я понимаю что он нужен что бы передать какие либо параметры в сервлет через дискриптор развертыванияНо зачем это надо?...

126
Как создать exe файл из jar файла на Jenkins?

Как создать exe файл из jar файла на Jenkins?

Подскажите может есть какой то плагин который будет создавать exe файл из jar файла?

134