Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
recyclerview android中的多个标头_Android_Layout_Header_Android Recyclerview - Fatal编程技术网

recyclerview android中的多个标头

recyclerview android中的多个标头,android,layout,header,android-recyclerview,Android,Layout,Header,Android Recyclerview,我创建了一个recyclerview,用于显示从服务器获取的数据。我只使用了一种布局来显示数据 现在我的要求是,当我上传图像或视频时,上传状态应该显示在服务器显示的数据顶部。i-e位于recyclerview的第0个位置。我可以添加任意数量的图像或视频 成功上传图像或视频后,我还想从recyclerview中删除该行。我想使用getItemViewType()来完成。在这种情况下使用两种布局。我不知道这个方法对不对。我没有办法解决这个问题 请 任何帮助…创建两种视图类型,如: private s

我创建了一个recyclerview,用于显示从服务器获取的数据。我只使用了一种布局来显示数据

现在我的要求是,当我上传图像或视频时,上传状态应该显示在服务器显示的数据顶部。i-e位于recyclerview的第0个位置。我可以添加任意数量的图像或视频

成功上传图像或视频后,我还想从recyclerview中删除该行。我想使用getItemViewType()来完成。在这种情况下使用两种布局。我不知道这个方法对不对。我没有办法解决这个问题


任何帮助…

创建两种视图类型,如:

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);