recyclerview android中的多个标头
我创建了一个recyclerview,用于显示从服务器获取的数据。我只使用了一种布局来显示数据 现在我的要求是,当我上传图像或视频时,上传状态应该显示在服务器显示的数据顶部。i-e位于recyclerview的第0个位置。我可以添加任意数量的图像或视频 成功上传图像或视频后,我还想从recyclerview中删除该行。我想使用getItemViewType()来完成。在这种情况下使用两种布局。我不知道这个方法对不对。我没有办法解决这个问题 请recyclerview android中的多个标头,android,layout,header,android-recyclerview,Android,Layout,Header,Android Recyclerview,我创建了一个recyclerview,用于显示从服务器获取的数据。我只使用了一种布局来显示数据 现在我的要求是,当我上传图像或视频时,上传状态应该显示在服务器显示的数据顶部。i-e位于recyclerview的第0个位置。我可以添加任意数量的图像或视频 成功上传图像或视频后,我还想从recyclerview中删除该行。我想使用getItemViewType()来完成。在这种情况下使用两种布局。我不知道这个方法对不对。我没有办法解决这个问题 请 任何帮助…创建两种视图类型,如: private s
任何帮助…创建两种视图类型,如:
private static final int REGULAR_HOLDER = 1;
private static final int LOADING_HOLDER = 2;
为位置0覆盖getItemViewType并返回加载U保持架,为所有其他位置覆盖常规。如果您正在加载或未加载,也有状态。如果您没有加载任何内容,您将返回所有行(位置)的常规\u支架
然后在onCreate中检查您是否有常规或正在加载的viewType,并创建适当的保持架。重要提示:使您的适配器实现RecyclerView.Adapter
而不是自定义的ViewHolder实现
下一步执行onBind。在那里,您必须检查您获得的viewHolder对象是否为RegularViewHolder的实例
或加载viewHolder的实例,如:
if (holder instance of RegularViewHolder) {
holder.doStuff();
} else if (holder instance of LoadingViewHolder) {
holder.showLoading();
}
在这之前,你应该做两个布局。一个用于常规行,另一个用于显示加载的行。创建两个实现ViewHolder的类,在上面的示例中,我称它们为RegularViewHolder
和LoadingViewHolder
编辑:需要记住的事情很少。我告诉过您要保持加载状态(加载或不加载),所以如果您想删除加载行,可以进行更改并调用notifyDataSetChanged()代码>。现在,getItemViewType
如果操作正确,应该返回所有常规行
此外,如果要显示10行数据,还应记住。如果正在加载,您的getItemCount()
应该返回11(10+加载行)。此外,在这种情况下,数据行从第二行(位置1)开始。您可以使用库轻松实现这一点
您应该首先创建一个截面类:
class MySection extends StatelessSection {
String title;
List<String> list;
public MySection(String title, List<String> list) {
// call constructor with layout resources for this Section header, footer and items
super(R.layout.section_header, R.layout.section_footer, R.layout.section_item);
this.title = title;
this.list = list;
}
@Override
public int getContentItemsTotal() {
return list.size(); // number of items of this section
}
@Override
public RecyclerView.ViewHolder getItemViewHolder(View view) {
// return a custom instance of ViewHolder for the items of this section
return new MyItemViewHolder(view);
}
@Override
public void onBindItemViewHolder(RecyclerView.ViewHolder holder, int position) {
MyItemViewHolder itemHolder = (MyItemViewHolder) holder;
// bind your view here
itemHolder.tvItem.setText(list.get(position));
}
@Override
public RecyclerView.ViewHolder getHeaderViewHolder(View view) {
return new SimpleHeaderViewHolder(view);
}
@Override
public void onBindHeaderViewHolder(RecyclerView.ViewHolder holder) {
MyHeaderViewHolder headerHolder = (MyHeaderViewHolder) holder;
// bind your header view here
headerHolder.tvItem.setText(title);
}
}
通过这种方式,您可以分别管理上载和下载列表中的项目,方法是从上载列表/下载列表中删除它们,然后通知适配器的更改。上载项目将始终显示在RecyclerView的顶部,因为它们位于添加到适配器的第一个部分中
如果您有不同的上传和下载布局,您可以为每个布局创建不同的节类。可能重复:如果我上传的媒体文件超过1个,该怎么办。例如:假设有10个标题(LoadingViewHolder),那么我应该如何删除已完成上载的行。如果您了解适配器的工作原理:getItemCount->getItemViewType->onCreateViewHolder->onBindViewHolder,这是可能的。但这是非常具体的,我不能在这里的评论中解释。您可以按照与上面示例相同的原则进行操作,但我的建议是查找并阅读一些关于多个holder视图类型的文章,以了解适配器的工作原理。
// Create an instance of SectionedRecyclerViewAdapter
SectionedRecyclerViewAdapter sectionAdapter = new SectionedRecyclerViewAdapter();
MySection uploadsSection = new MySection("Uploads", uploadList);
MySection downloadsSection = new MySection("Downloads", downloadList);
// Add your Sections
sectionAdapter.addSection(uploadsSection);
sectionAdapter.addSection(downloadsSection);
// Set up your RecyclerView with the SectionedRecyclerViewAdapter
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
recyclerView.setAdapter(sectionAdapter);