当前位置: 首页 > article >正文

android 顺滑滑动嵌套布局

1. 背景

最近项目中用到了上面的布局,于是使用了scrollview+recycleview,为了自适应高度,重写了recycleview,实现了高度自适应:

public class CustomRecyclerView extends RecyclerView {
    
    public CustomRecyclerView(@NonNull Context context) {
        super(context);
    }

    public CustomRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthSpec, int heightSpec) {
        int height = MeasureSpec.makeMeasureSpec(
                Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
        super.onMeasure(widthSpec, height);
    }
}

这也是通常将列表控件高度自适应的处理方法。

但是效果有点卡顿,表现为可以滑动,但没了滑动的惯性、每次滑动的距离几乎一样、不跟手。

2. 优化

开始从adapter上着手:

1. 优化了inflater初始化:放到了adapter构造方法中,比,避免每次调用view。inflate时都创建新的Layoutinflater

private LayoutInflater mInflater;  
  
public YourAdapter(Context context) {  
    mContext = context;  
    mInflater = LayoutInflater.from(context);  
    // ... 其他初始化代码 ...  

2. 优化了布局的渲染:根据item类型加载,如下

 @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        if (viewType == INDEX_TYPE_EVALUATE) {
            View evaluateView = mInflater.inflate(R.layout.index_group_adapter_layout_1, null);
            return new IndexGroupItemEvaluateHolder(evaluateView, INDEX_TYPE_EVALUATE);
        } else {
            View normalView = mInflater.inflate(R.layout.index_group_adapter_layout, null);
            return new IndexGroupItemNormalHolder(normalView, INDEX_TYPE_NORMAL);
        }
    }

3. 优化onBindViewHolder:不要在该方法中重复调用getItemViewType(position),因为recycle已经根据getItemViewType的结果为viewholder分配了类型。

@Override  
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {  
    if (holder instanceof IndexGroupItemNormalHolder) {  
        IndexGroupItemNormalHolder h = (IndexGroupItemNormalHolder) holder;  
        h.bind(mTeamList.get(position), true, Gravity.CENTER);  
    } else if (holder instanceof IndexGroupItemEvaluateHolder) {  
        IndexGroupItemEvaluateHolder h = (IndexGroupItemEvaluateHolder) holder;  
        h.bind(mTeamList.get(position), false, Gravity.CENTER_VERTICAL);  
    }  
}

效果并不理想,滑动依然不顺畅。

3.解决

在通过“文心一言”的帮助后,修改布局:将普通的scrollview改为nestedscrollview,恢复自定义的高度自适应的recycleview为普通recycleview

然后滑动丝滑流畅


http://www.kler.cn/a/273416.html

相关文章:

  • 为什么我们调用 start()方法时会执行 run()方法 ,为什么我们不能 直接调用 run()方法?
  • RV1126-SDK学习之OSD实现原理
  • 服务器作业(2)
  • 使用JdbcTemplate 进行数据库的增、删、改、查
  • 批量删除redis数据【亲测可用】
  • RabbitMQ的原理和集成使用
  • Mac玩《幻兽帕鲁》为什么打不开D3DMetal?d3d错误怎么办 d3dxl error
  • 基于YOLOv8深度学习的橙子病害智能诊断与防治系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标分类
  • mac清除dns缓存指令 mac清除缓存怎么清理
  • 复制word文档,合并word文档
  • 【vscode】vscode重命名变量后多了很多空白行
  • 计算地球圆盘负荷产生的位移
  • Ubuntu 搭建gitlab服务器,及使用repo管理
  • 利用textarea和white-space实现最简单的文章编辑器 支持缩进和换行
  • vue使用element-ui 实现自定义分页
  • TT-100K数据集,YOLO格式
  • MR混合现实情景实训教学系统在汽车检修课堂中的应用
  • 汽车电子零部件(8):T_Box
  • vsto excel 插件注册表属性值含义
  • linux学习之Socket
  • 多ip多进程代理的实现方法
  • Github 2024-03-18开源项目日报Top10
  • 动态规划(蓝桥杯 C++ 题目 代码 注解)
  • [TJOI2010] 阅读理解 **STL**Tire树**
  • 003——移植鸿蒙
  • Coursera上Golang专项课程3:Concurrency in Go 学习笔记(完结)