整合大量开源库项目(七)ListView迁移成 RecyclerView

简介:

转载请注明出处:王亟亟的大牛之路

开场先介绍下为什么使用RecyclerView,以及一些简单的理论知识

Q:为什么使用RecyclerView?
A: 一个非常灵活的用于在有限的窗口范围内显示大量数据的控件。

Q:使用RecyclerView的好处是什么?
A:提供了一种插拔式的体验,高度的解耦,异常的灵活

Q:RecyclerView可以实现什么?
A:ListView、GridView、瀑布效果等等等,并且性能优异!

OK,理论知识大致的介绍到这里,更多内容我们在代码中实现。

上一篇文章,我们是用一个CodeAdapter extends BaseAdapter来实现我们的适配器,而RecyclerView是另一种不同的实现,代码如下。

public class CodeActivity extends Son {
    private RecyclerView mRecyclerView;
    private RecyclerView.LayoutManager mLayoutManager;
    private CodeAdapter adapter;

    ToastUtils toastUtils;
    LogicJumpTo logicJumpTo;

    @Override
    public int getLayout() {
        LogUtils.d("--->CodeActivity getLayout");
        return R.layout.activity_code;
    }

    @Override
    public void init() {
        toastUtils = ToastUtils.getInstance();
        logicJumpTo = LogicJumpTo.getInstance();

        //创建默认的线性LayoutManager
        mLayoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(mLayoutManager);
        //如果可以确定每个item的高度是固定的,设置这个选项可以提高性能
        mRecyclerView.setHasFixedSize(true);
        adapter = new CodeAdapter(getResources().getStringArray(R.array.codeArray));
        mRecyclerView.setAdapter(adapter);
        adapter.setOnItemClickListener(new CodeAdapter.OnRecyclerViewItemClickListener() {
            @Override
            public void onItemClick(View view, String data) {
                toastUtils.show(CodeActivity.this, data, false);
                switch (data) {
                    case "For EditText":
                        logicJumpTo.noValueJump(CodeActivity.this, EditTextActivity.class);
                        break;
                    case "For TextView":
                        break;
                    case "For Button/CheckBox/Switch/ProgressBar/Spinner":
                        break;
                    case "For ListView/GridView/TabHost":
                        break;
                    case "For Dialog":
                        break;
                    case "For CustomView":
                        break;
                    case "For ImageView":
                        break;
                    case "For WebView":
                        break;
                    case "For Animation":
                        break;
                    case "For Layout":
                        break;
                    case "For Menu":
                        break;
                    case "For NetWork":
                        break;
                    case "Others":
                        break;

                }
            }
        });
    }

    @Override
    public void bindID() {
        ActionBar actionBar = getActionBar();
        actionBar.setTitle("个人开发");
        actionBar.setDisplayHomeAsUpEnabled(true);

        mRecyclerView = (RecyclerView) findViewById(R.id.codeListView);

    }

    @Override
    public void setOnclick() {

    }

    @Override
    public void logic() {
        LogUtils.d("--->CodeActivity logic");

    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                finish();
                return true;
        }
        return super.onOptionsItemSelected(item);
    }

    public static class CodeAdapter extends RecyclerView.Adapter<CodeAdapter.ViewHolder> implements OnClickListener{

        public String[] datas = null;

        public CodeAdapter(String[] datas) {
            this.datas = datas;
        }

        public static interface OnRecyclerViewItemClickListener {
            void onItemClick(View view, String data);
        }

        private OnRecyclerViewItemClickListener mOnItemClickListener = null;

        public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) {
            this.mOnItemClickListener = listener;
        }

        //创建新View,被LayoutManager所调用
        @Override
        public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
            View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.code_listview_item, viewGroup, false);
            ViewHolder vh = new ViewHolder(view);
            //将创建的View注册点击事件
            view.setOnClickListener(this);
            return vh;
        }

        //将数据与界面进行绑定的操作
        @Override
        public void onBindViewHolder(ViewHolder viewHolder, int position) {
            viewHolder.mTextView.setText(datas[position]);
            //将数据保存在itemView的Tag中,以便点击时进行获取
            viewHolder.itemView.setTag(datas[position]);
        }

        //获取数据的数量
        @Override
        public int getItemCount() {
            return datas.length;
        }

        @Override
        public void onClick(View v) {
            if (mOnItemClickListener != null) {
                //注意这里使用getTag方法获取数据
                mOnItemClickListener.onItemClick(v,(String)v.getTag());
            }

        }

        //自定义的ViewHolder,持有每个Item的的所有界面元素
        public class ViewHolder extends RecyclerView.ViewHolder {
            public TextView mTextView;

            public ViewHolder(View view) {
                super(view);
                mTextView = (TextView) view.findViewById(R.id.codeText);
            }
        }
    }

}


以上就是所有的Java代码层面的内容,下面会一点点来解释。

首先,说明一下!

RecyclerView是没有本身写好的 OnItemClickListener ()这样的回调的,得自己写!!

Item之间的间距啊,差异性什么的都可以存在,但是要用ItemDecoration 自己写!!

要让他变成ListView,GridView需要用LayoutManager这里倒不用自己写了!!


布局跟ListView类似,而且我们之前的ListView的动画也能沿用至此

 <android.support.v7.widget.RecyclerView
        android:id="@+id/codeListView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:choiceMode="singleChoice"
        android:scrollbars="none"
        android:layoutAnimation="@anim/code_item_anim" />

findViewById啊设置什么的都不多说,主要 点一下CodeAdapter 这一部分。

跟ListView一样,需要设置RecyclerView的Adapter,但是这里的Adapter跟ListView使用的Adapter不一样,这里的Adapter需要继承RecyclerView.Adapter,需要实现3个方法:

  - onCreateViewHolder()

  - onBindViewHolder()

  - getItemCount()

之前的一些ArrayAdapter,BaseAdapter的就不要在这里使用了,统一使用RecyclerView.Adapter。

public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i)

这个方法主要生成为每个Item inflater出一个View,但是该方法返回的是一个ViewHolder。方法是把View直接封装在ViewHolder中,然后我们面向的是ViewHolder这个实例,当然这个ViewHolder需要我们自己去编写。直接省去了当初的convertView.setTag(holder)和convertView.getTag()这些繁琐的步骤。

public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i)
这个方法主要用于适配渲染数据到View中。方法提供给你了一个viewHolder,而不是原来的convertView。

然后就是我们的点击实现,首先这边我们创建一个借口,然后去实现这个接口。再在我们的主Activity中去setOnItemClickListener,使之成为有效的回路,来完成我们的业务逻辑。

源码地址:https://github.com/ddwhan0123/SoyiGit

事例APK:https://github.com/ddwhan0123/SoyiGit/blob/master/Soyi/Soyi.apk

记得点个赞哦!

这里写图片描述

目录
相关文章
|
存储 Java Android开发
Android插件化动态加载apk
支付宝作为一个宿主apk提前将要集成的apk作为一个插件(plugin)下载到本地,然后当使用该plugin(apk)的时候再去加载对应plugin(apk)的资源文件以及对应的native页面。就是不去安装plugin(apk)就可以直接运行该plugin(apk)中的页面。
1074 0
|
机器学习/深度学习 人工智能 算法
|
6月前
|
算法 数据安全/隐私保护
基于16QAM的载波同步和定时同步性能仿真,采用四倍采样,包括Costas环和gardner环
本内容主要介绍了基于MATLAB的算法仿真及其涉及的理论知识。通过Matlab2022a仿真,展示了载波同步与位同步在通信系统中的实现效果,并提供无水印的完整代码运行结果。理论部分详细阐述了载波同步、位同步的概念,以及Costas环和Gardner定时误差算法的应用原理。核心程序包括鉴相器、环路滤波器处理及NCO相位生成等关键步骤,最终通过星座图对比验证了16QAM信号同步前后的性能改善。
198 30
|
6月前
|
NoSQL 应用服务中间件 PHP
布谷一对一直播源码android版环境配置流程及功能明细
部署需基于 CentOS 7.9 系统,硬盘不低于 40G,使用宝塔面板安装环境,包括 PHP 7.3(含 Redis、Fileinfo 扩展)、Nginx、MySQL 5.6、Redis 和最新 Composer。Swoole 扩展需按步骤配置。2021.08.05 后部署需将站点目录设为 public 并用 ThinkPHP 伪静态。开发环境建议 Windows 操作系统与最新 Android Studio,基础配置涉及 APP 名称修改、接口域名更换、包名调整及第三方登录分享(如 QQ、微信)的配置,同时需完成阿里云与腾讯云相关设置。
|
机器学习/深度学习 文字识别 TensorFlow
手写数字识别
【8月更文挑战第8天】手写数字识别。
182 1
|
11月前
「Mac畅玩鸿蒙与硬件32」UI互动应用篇9 - 番茄钟倒计时应用
本篇将带你实现一个番茄钟倒计时应用,用户可以设置专注时间和休息时间的时长,点击“开始专注”或“开始休息”按钮启动计时,应用会在倒计时结束时进行提醒。番茄钟应用对于管理时间、提升工作效率非常有帮助,并且还会加入猫咪图片作为界面装饰,让体验更加有趣。
332 8
「Mac畅玩鸿蒙与硬件32」UI互动应用篇9 - 番茄钟倒计时应用
|
10月前
|
IDE JavaScript 开发工具
一、鸿蒙应用开发快速体验
本文介绍了鸿蒙应用开发的快速体验流程,涵盖从开发环境的准备到项目的实际运行。首先,需安装并配置华为DevEco Studio IDE,该IDE基于IntelliJ IDEA Community构建,旨在为鸿蒙应用开发提供一站式解决方案。接着,通过创建新项目、选择合适的模板及配置项目信息,可以迅速搭建起应用的基本框架。最后,本文还详细描述了如何利用Preview预览、模拟器运行以及真机调试三种方式来测试和优化应用,确保其在不同场景下的兼容性和性能表现。整个过程旨在帮助开发者快速入门鸿蒙应用开发,提升开发效率。
318 0
一、鸿蒙应用开发快速体验
|
Java 网络安全
SSL peer shut down incorrectly
SSL peer shut down incorrectly
1066 0
|
Java Maven
Gradle、Maven使用阿里镜像源
Gradle、Maven使用阿里镜像源
46608 1
|
运维 监控 Cloud Native
稳定性领导者!阿里云获得信通院多项系统稳定性最高级认证
由中国信息通信研究院主办的首届云系统稳定性大会在京召开。会上,阿里云斩获多项云原生产品先进级认证,并领衔稳定性守护者团队,未来将持续推动国内系统稳定性领域的快速发展!!
稳定性领导者!阿里云获得信通院多项系统稳定性最高级认证