Как создать липкие заголовки в FirebaseRecyclerAdapter - PullRequest
0 голосов
/ 19 мая 2018

У меня есть основной обзор переработчика, в который я хочу добавить заголовки.Это было бы простой задачей, если бы я создал свой собственный адаптер, но я использую FirebaseRecyclerAdapter из библиотеки пользовательского интерфейса firebase из-за преимуществ, которые он имеет.Мои данные json в firebase содержат 2 типа «объектов» в одном и том же основном списке, один тип - релиз фильма, а другой тип - объект заголовка.Таким образом, это означает, что я могу проверить, о каких данных мы говорим, если это объект заголовка, идентификатор фильма будет нулевым (не существует).Мне нужны липкие заголовки, что означает, что я хочу, чтобы заголовок месяца всегда был сверху. Я хочу, чтобы заголовок «Май» оставался наверху до тех пор, пока пользователь не прокрутит вниз до выпусков фильма «Июнь», и в этом случае следующим элементом будет «Июнь».Как я могу это сделать?

Мой код, как известно:

        FirebaseRecyclerOptions<_Release> options =
            new FirebaseRecyclerOptions.Builder<_Release>()
                    .setQuery(mReleasesRef, _Release.class)
                    .build();

    adapter = new FirebaseRecyclerAdapter<_Release, RecyclerView.ViewHolder>(options) {
        public final static int TYPE_HEADER = 0;
        public final static int TYPE_ITEM = 1;

        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            // Create a new instance of the ViewHolder, in this case we are using a custom
            // layout called R.layout.message for each item
            if (viewType == TYPE_ITEM) {
                View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.movie_release_item, parent, false);
                return new ReleaseHolder(view);
            } else {
                View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.header, parent, false);
                return new HeaderHolder(view);
            }
        }

        @Override
        public int getItemViewType(int position) {
            if (getItem(position).getGame() == null) {
                return TYPE_HEADER;
            }
            return TYPE_ITEM;
        }

        @Override
        protected void onBindViewHolder(RecyclerView.ViewHolder holder, int position, _Release release) {
            // Bind the Release object to the ReleaseHolder
            if (holder instanceof  HeaderHolder) {
                HeaderHolder headerHolder = (HeaderHolder) holder;
                headerHolder.setHeaderText(release.getName());
            } else if (holder instanceof ReleaseHolder) {
                ReleaseHolder releaseHolder = (ReleaseHolder) holder;
                releaseHolder.setName("");

            }
        }
    };

Моя структура базы данных:

"data" : [ {
    "m" : 5,
    "name" : "May 2018",
    "y" : 2018
  }, {
    "category" : 0,
    "created_at" : 1525589123745,
    "date" : 1525564800000,
    "movie" : 121,
    "human" : "2018-May-06",
    "id" : 152209,
    "m" : 5,
    "platform" : [ 3, 14, 6 ],
    "region" : 8,
    "updated_at" : 1525594750205,
    "y" : 2018
  }]

1 Ответ

0 голосов
/ 19 мая 2018

Вы можете добавить любой пользовательский объект в FirebaseRecyclerAdapter (без необходимости загрузки его из базы данных Firebase) , переопределив getItemCount и getItem методы.

Пример (java) - пользовательский элемент в позиции 0. Остальная часть списка загружается из базы данных):

@Override
public int getItemCount() {
    if (super.getItemCount() == 0)
      return 0;    // use this perk to prevent showing heder element before 
                   // database query is fully-loaded

      return super.getItemCount() + 1;
}

@Override
public _Release getItem(int position) {
    if (position == (getItemCount() - 1)) {
        _Release asdf = new _Release();
        // init data of object
        return asdf;
    } else {
        return super.getItem(position);
    }
}
...