android - 如何在 FirebaseRecyclerAdapter 中创建粘性标头
问题描述
我有一个主要的回收视图,我想向其中添加标题。如果我创建了自己的适配器,这将是一件容易的事,但我使用的是 firebase Ui 库中的 FirebaseRecyclerAdapter,因为它具有优势。我在 firebase 中的 json 数据在同一个主列表中包含两种类型的“对象”,一种是电影发行,另一种是标题对象。所以这意味着我可以检查我们正在谈论的数据,如果它是一个标题对象,那么电影 ID 将为空(不存在)。我想要粘性标题,这意味着我希望月份标题始终位于顶部。我希望“May”标题一直保持在顶部,直到用户向下滚动到“June”电影版本,在这种情况下,下一个要保持在顶部的项目将是“June”。我该怎么做呢?
据我所知,我的代码:
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
}]
解决方案
您可以通过覆盖和方法将任何自定义对象添加到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);
}
}
推荐阅读
- javascript - 如何从具有不同 ID 的重复父类中获取所有文本内容?
- typo3 - 使用 Composer 激活 TYPO3 扩展时出错
- maven - 执行 org.apache.axis2:axis-wsdl2code-maven-plugin:1.3 时缺少必需的类
- php - php 从 URL 获取 JSON
- rabbitmq - RabbitMq 生成自动原理图
- php - Codeigniter:Restfull Api 将 Json 从字符串转换为整数
- javascript - 如何使用 DOM 可用的所有输出遍历 JavaScript for 循环
- webpack - 按顺序运行 webpack 配置
- r - 如何使用 R 找到每个 ID 的最大连续序列的开始和结束?
- html - 联系块不是移动响应的