recyclerview固定头部
时间: 2023-09-08 10:14:54 浏览: 85
RecyclerView 的头部可以通过设置一个包含头部视图的 RecyclerView.Adapter 实现。对于固定头部,我们可以使用两个不同的 ViewHolder,在 RecyclerView 中分别作为头部和内容项的 ViewHolder。
首先,我们需要在 RecyclerView.Adapter 中重写 getItemViewType 方法来返回不同的视图类型。例如,我们可以使用 0 来表示头部视图,1 表示内容项视图。
接下来,我们需要创建两个不同的 ViewHolder 类,一个用于头部视图,一个用于内容项视图。在 onCreateViewHolder 方法中,我们可以根据 viewType 来创建对应的 ViewHolder。
在 onBindViewHolder 方法中,我们需要根据位置来判断当前项是头部还是内容项,并分别处理。对于头部项,我们可以直接设置它的显示内容;对于内容项,我们可以继续处理它的显示内容。
最后,我们需要在 RecyclerView 中使用一个布局管理器来管理 RecyclerView 的布局,并设置一个 RecyclerView.ItemDecoration 来设置头部视图的显示位置。例如,我们可以自定义一个 ItemDecoration 类,在其中实现 getItemOffsets 方法来设置头部视图的偏移量。
以下是一个简单的 RecyclerView 固定头部的示例代码:
```
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final int TYPE_HEADER = 0;
private static final int TYPE_ITEM = 1;
private List<String> mData;
public MyAdapter(List<String> data) {
mData = data;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPE_HEADER) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.header_view, parent, false);
return new HeaderViewHolder(view);
} else {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_view, parent, false);
return new ItemViewHolder(view);
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof HeaderViewHolder) {
// 处理头部视图
} else if (holder instanceof ItemViewHolder) {
// 处理内容项视图
}
}
@Override
public int getItemViewType(int position) {
if (position == 0) {
return TYPE_HEADER;
} else {
return TYPE_ITEM;
}
}
@Override
public int getItemCount() {
return mData.size() + 1;
}
private static class HeaderViewHolder extends RecyclerView.ViewHolder {
public HeaderViewHolder(View itemView) {
super(itemView);
}
}
private static class ItemViewHolder extends RecyclerView.ViewHolder {
public ItemViewHolder(View itemView) {
super(itemView);
}
}
}
public class MyItemDecoration extends RecyclerView.ItemDecoration {
private int mHeaderHeight;
public MyItemDecoration(int headerHeight) {
mHeaderHeight = headerHeight;
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
int position = parent.getChildAdapterPosition(view);
if (position == 0) {
outRect.top = mHeaderHeight;
}
}
}
public class MainActivity extends AppCompatActivity {
private RecyclerView mRecyclerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRecyclerView = findViewById(R.id.recycler_view);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(layoutManager);
List<String> data = new ArrayList<>();
for (int i = 0; i < 20; i++) {
data.add("Item " + i);
}
MyAdapter adapter = new MyAdapter(data);
mRecyclerView.setAdapter(adapter);
int headerHeight = getResources().getDimensionPixelSize(R.dimen.header_height);
MyItemDecoration itemDecoration = new MyItemDecoration(headerHeight);
mRecyclerView.addItemDecoration(itemDecoration);
}
}
```
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)