android recyclerview设置GridLayoutManager布局管理器添加头布局

本文介绍了解决ScrollView嵌套RecyclerView时出现的滑动冲突问题,提供了两种解决方案:一是使用NestedScrollView替代ScrollView;二是通过添加头部布局并调整RecyclerView的SpanSizeLookup,确保滑动顺畅。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题起因:ScrollView嵌套RecyclerView滑动冲突的问题

解决前:                                                                          解决后:

    

第一种方案: 使用NestedScrollView代替ScrollView

第二种方案添加头布局,这里我写了一个demo测试一下

1.布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

2.activity代码片段 

package tv.leave.rpc.xrwulian.textrvandsv;

import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    private RecyclerView recyclerview;
    private GridLayoutManager gridLayoutManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerview = findViewById(R.id.recyclerview);
        ArrayList<String> list = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            list.add("" + i);
        }
        MyAdapter myAdapter = new MyAdapter(this);
        myAdapter.setList(list);
        gridLayoutManager = new GridLayoutManager(this, 2);
        recyclerview.setLayoutManager(gridLayoutManager);
        //关键就是这个地方
        gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
                                                @Override
                                                public int getSpanSize(int position) {
                                                    return position == 0 ? gridLayoutManager.getSpanCount() : 1;
                                                }
                                            }
        );
        recyclerview.setAdapter(myAdapter);
    }
}

3.adapter代码

package tv.leave.rpc.xrwulian.textrvandsv;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.BaseViewHolder> {

    private Context context;
    private ArrayList<String> list = new ArrayList<>();
    private int TYPE_HEADER = 1001;

    public MyAdapter(Context context) {
        this.context = context;
    }

    @NonNull
    @Override
    public BaseViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        if (viewType == TYPE_HEADER) {
            View headerView = LayoutInflater.from(context).inflate(R.layout.head_layout, parent, false);
            HeaderViewHolder headerViewHolder = new HeaderViewHolder(headerView);
            headerViewHolder.ivTest = headerView.findViewById(R.id.ivHead);
            return headerViewHolder;
        }
        View inflate = LayoutInflater.from(context).inflate(R.layout.item, parent, false);
        MyViewHolder myViewHolder = new MyViewHolder(inflate);
        myViewHolder.tvItem = inflate.findViewById(R.id.tvItem);
        return myViewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull BaseViewHolder holder, int position) {
        if (holder instanceof MyViewHolder) {
            holder.tvItem.setText(list.get(position));
        } else if (holder instanceof HeaderViewHolder) {
            holder.ivTest.setImageResource(R.drawable.a);
        }
    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    public void setList(ArrayList<String> list) {
        this.list = list;
        notifyDataSetChanged();
    }

    public class MyViewHolder extends BaseViewHolder {
        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
        }
    }

    public class HeaderViewHolder extends BaseViewHolder {
        public HeaderViewHolder(View headerView) {
            super(headerView);
        }
    }

    public class BaseViewHolder extends RecyclerView.ViewHolder {
        public BaseViewHolder(@NonNull View itemView) {
            super(itemView);
        }

        public TextView tvItem;
        public ImageView ivTest;
    }

    @Override
    public int getItemViewType(int position) {
        //在第一个位置添加头
        if (position == 0) {
            return TYPE_HEADER;
        }
        return super.getItemViewType(position);
    }
}

博客只用于记录自己开发中遇到的问题,并提供相应的解决方案

感兴趣的话可以自行搜索相关api使用方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值