У меня есть основное приложение recyclerview, в которое я хочу добавить заголовки. Это было бы несложной задачей, если бы я создал свой собственный адаптер, но я использую 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
}]
обновите вопрос, чтобы уточнить, что вы имеете в виду под «липкими заголовками»
@Mladen Обновлено. Спасибо за ваше предложение
Вы можете добавить любой пользовательский объект в FirebaseRecyclerAdapter(без необходимости загружать его из базы данных Firebase), переопределив методы getItemCount и getItem.
Пример (java) - пользовательский элемент в позиции 0. Остальная часть списка загружена из db):
@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);
}
}
Библиотека, которая работает с FirebaseRecyclerAdapter, тоже подойдет, спасибо!