Android RecycleView

本文详细介绍了如何在Android中使用RecyclerView实现自定义列表项,包括创建ViewHolder、绑定数据及布局管理器的设置。

选择app,右键 — Open Module SettingsDependencies+ Library Dependencyrecycleview-v7

public class MainActivity extends Activity {

    private RecyclerView rv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        rv = new RecyclerView(this);
        setContentView(rv);
        rv.setLayoutManager(new LinearLayoutManager(this));
        rv.setAdapter(new RecyclerView.Adapter() {

            class ViewHolder extends RecyclerView.ViewHolder {

                private TextView tv;

                public ViewHolder(TextView itemView) {
                    super(itemView);
                    tv = itemView;
                }

                public TextView getTv() {
                    return tv;
                }

            }

            @Override
            public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                return new ViewHolder(new TextView(parent.getContext()));
            }

            @Override
            public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
                ViewHolder vh = (ViewHolder)holder;
                vh.getTv().setText("Item"+position);
            }

            @Override
            public int getItemCount() {
                return 100;
            }
        });
    }
}

使用资源文件自定义列表项:

public class MainActivity extends Activity {

    private RecyclerView rv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        rv = new RecyclerView(this);
        setContentView(rv);
        rv.setLayoutManager(new LinearLayoutManager(this));
        rv.setAdapter(new RecyclerView.Adapter() {

            class ViewHolder extends RecyclerView.ViewHolder {

                private View root;
                private TextView tvTitle,tvContent;

                public ViewHolder(View root) {
                    super(root);
                    tvTitle = (TextView)root.findViewById(R.id.tvTitle);
                    tvContent = (TextView)root.findViewById(R.id.tvContent);
                }

                public TextView getTvTitle() {
                    return tvTitle;
                }

                public TextView getTvContent() {
                    return tvContent;
                }
            }

            @Override
            public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.list_cell,null));
            }

            @Override
            public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
                ViewHolder vh = (ViewHolder)holder;
                CellData cd = data[position];
                vh.getTvTitle().setText(cd.title);
                vh.getTvContent().setText(cd.content);
            }

            @Override
            public int getItemCount() {
                return data.length;
            }

            private CellData[] data = new CellData[]{new CellData("iOS","my first career"),new CellData("Android","extra career")};
        });
    }


}
源码地址: https://pan.quark.cn/s/d1f41682e390 miyoubiAuto 米游社每日米游币自动化Python脚本(务必使用Python3) 8更新:更换cookie的获取地址 注意:禁止在B站、贴吧、或各大论坛大肆传播! 作者已退游,项目不维护了。 如果有能力的可以pr修复。 小引一波 推荐关注几个非常可爱有趣的女孩! 欢迎B站搜索: @嘉然今天吃什么 @向晚大魔王 @乃琳Queen @贝拉kira 第三方库 食用方法 下载源码 在Global.py中设置米游社Cookie 运行myb.py 本地第一次运行时会自动生产一个文件储存cookie,请勿删除 当前仅支持单个账号! 获取Cookie方法 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 按刷新页面,按下图复制 Cookie: How to get mys cookie 当触发时,可尝试按关闭,然后再次刷新页面,最后复制 Cookie。 也可以使用另一种方法: 复制代码 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 控制台粘贴代码并运行,获得类似的输出信息 部分即为所需复制的 Cookie,点击确定复制 部署方法--腾讯云函数版(推荐! ) 下载项目源码和压缩包 进入项目文件夹打开命令行执行以下命令 xxxxxxx为通过上面方式或取得米游社cookie 一定要用双引号包裹!! 例如: png 复制返回内容(包括括号) 例如: QQ截图20210505031552.png 登录腾讯云函数官网 选择函数服务-新建-自定义创建 函数名称随意-地区随意-运行环境Python3....
Android 开发中,`RecyclerView` 是一个非常强大的 UI 组件,用于展示大量数据并实现高效的滚动和渲染性能。它通过灵活的布局管理器(LayoutManager)、适配器(Adapter)和视图持有者(ViewHolder)模式,支持多种复杂的列表和网格布局。 ### 布局管理器的使用 `RecyclerView` 支持多种布局管理器,其中最常用的是 `LinearLayoutManager`、`GridLayoutManager` 和 `StaggeredGridLayoutManager`。对于需要多列或多行布局的情况,`GridLayoutManager` 提供了灵活的配置方式。例如,在某些场景下需要让不同的条目占据不同的行列数,可以通过重写 `SpanSizeLookup` 实现: ```java @Override public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) { super.onAttachedToRecyclerView(recyclerView); RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); if (layoutManager instanceof GridLayoutManager) { GridLayoutManager gridLayoutManager = (GridLayoutManager) layoutManager; gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { int itemViewType = getItemViewType(position); if (itemViewType == LEFT) { return 2; } else if (itemViewType == CENTER) { return 6; } else if (itemViewType == RIGHT) { return 3; } return 6; } }); } } ``` 这种方式特别适用于需要在同一 `RecyclerView` 中混合不同大小条目的情况,如首页信息流中的广告位、推荐商品等[^2]。 ### 数据更新优化:DiffUtil 的应用 当数据集发生变化时,直接调用 `notifyDataSetChanged()` 可能会导致不必要的重绘和重新绑定操作,影响性能。为此,Android 提供了 `DiffUtil` 工具类来计算新旧数据之间的差异,并仅更新必要的部分。关键在于实现 `areItemsTheSame` 和 `areContentsTheSame` 方法,以确定哪些项是相同的以及它们的内容是否发生了变化: ```java public class MyDiffCallback extends DiffUtil.ItemCallback<MyItem> { @Override public boolean areItemsTheSame(@NonNull MyItem oldItem, @NonNull MyItem newItem) { return oldItem.getId() == newItem.getId(); } @Override public boolean areContentsThe相同(@NonNull MyItem oldItem, @NonNull MyItem newItem) { return oldItem.equals(newItem); } } ``` 通过 `DiffUtil.calculateDiff()` 计算出差异后,可以调用 `submitList()` 或类似方法将更新提交到 `RecyclerView.Adapter`,从而实现高效的数据刷新[^3]。 ### 轮播图控件的实现 为了构建一个功能完善的轮播图控件,通常会基于 `RecyclerView` 进行扩展。这包括自定义 `LayoutManager` 来控制子视图的位置、方向和动画效果,同时还需要实现自动循环播放逻辑、点击事件监听以及指示器同步等功能。具体来说,可以借助 `PagerSnapHelper` 或类似的辅助类帮助实现页面对齐效果,并结合定时任务定期切换当前页码。 此外,考虑到内存效率问题,应尽量减少每个条目的复杂度并合理利用缓存机制。例如,对于图片资源,建议采用 Glide 或 Picasso 等第三方库进行加载和缓存处理;而对于文本或其他静态内容,则可通过复用已有的 View 对象降低创建成本。 ### 常见问题与解决方案 1. **条目间距不一致**:确保所有 ItemDecoration 都正确设置了偏移量,或者检查 LayoutManager 是否有特殊配置。 2. **滚动卡顿**:优化 onBindViewHolder 内部的操作,避免在此处执行耗时任务,比如网络请求或数据库查询。 3. **无法响应点击事件**:确认 OnItemClickListener 是否被正确设置,并且 ViewHolder 中的 itemView 没有被覆盖或拦截触摸事件。 4. **数据更新异常**:使用 DiffUtil 替代 notifyDataSetChanged() 可以有效减少界面抖动现象,提高用户体验。 5. **初始化失败**:检查 XML 文件中 RecyclerView 的声明是否完整,以及关联的 Adapter 是否已经实例化并且绑定到了正确的 RecyclerView 上。 综上所述,掌握这些核心概念和技术细节有助于开发者更好地利用 `RecyclerView` 构建高性能且交互友好的 Android 应用程序。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值