整合大量开源库项目(七)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

记得点个赞哦!

时间: 2024-08-04 04:07:27

整合大量开源库项目(七)ListView迁移成 RecyclerView的相关文章

整合大量开源库项目(六)ListView动画,Activity&quot;抽象化&quot;,顺便提一提”抽象类“And&quot;接口&quot;

转载请注明出处:王亟亟的大牛之路 昨天发了一个自己写的简单的诸如EditText一个自定义控件,不过貌似反响不太好,这里再推一推,希望大家给予意见和支持:http://blog.csdn.net/ddwhan0123/article/details/50235151 OK,言归正传,上一次添加了一个"个人开发:界面,希望把之后自己写的一些东西都加入里面,作为一个"大型Lib"使用,所以就简单的把内容和界面搭了一下,也大致区分了下栏目,这种展示性的还是以ListView为佳,上

整合大量开源库项目(八)能够载入Gif动画的GifImageView

转载请注明出处王亟亟的大牛之路 上周大多数时间都是依据兴起,想到什么做什么写了几个自己定义控件,把Soyi丢在那没怎么动,今天就把写的东西整合进来,顺便把SOyi"个人研发的结构理一下". 先上一下今天整合之后的效果,以及新加进来的几个库: 依照惯例,贴一下Gradle的配置: dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') testCompile 'junit:junit:4.12' compile '

整合大量开源库项目(五)跳动的TextView JumpingBeans,良好体验的滚动栏ConvenientBanner

转载请注明出处:王亟亟的大牛之路 时间过得很快,这一系列已经写了第五篇了(感觉还要写好久),今天又引入了2个很好用的库JumpingBeans,ConvenientBanner.首先,先看一下效果. 1.这2个控件做了什么? JumpingBeans是加载页面时那个蓝色跳动的动画效果. JumpingBeans:https://github.com/frakbot/JumpingBeans ConvenientBanner是滚动的那个广告栏. ConvenientBanner:https://g

Android开源库项目集锦

一.兼容类库 ActionBarSherlock : Action Bar是Android 3.0后才開始支持的,ActionBarSherlock是让Action Bar功能支持2.X后的全部平台.并且他会自己主动的推断是调用原生Action Bar还是使用扩展ActionBar. 在我的小熊词典里实用到这个库,并且非常多非常知名的App也在使用这个库.GitHub Official ActionBar科普 Android-ViewPagerIndicator : 这是与ViewPager兼容

直播相关的开源库/项目

RTMP播放相关 FFmpegGitHub所有版本编译脚本脚本 gas-preprocessor FFmpeg-AVPlayer-For-iOS-tvOSGitHub VitamioGitHub PLPlayerKitGitHub kxmovieGitHub ijkplayerGitHub VLCGitHubGitLab SmarterStreamingGitHub rtmp-video-player-for-iosGitHub Eleven PlayerGitHub RTMP推流相关 libr

导入开源库到基于Android Studio构建的项目中

前两天,谷歌发布了Android Studio 1.0的正式版,也有更多的人开始迁移到Android Studio进行开发.然而,网上很多的开源库,控件等还是以前的基于Eclipse进行开发,很多人不知道怎么导入到自己的基于Android Studio项目中来,微博上也有人私信我,让我来写写,正好今天回来的比较早,就写写吧.主要介绍一下常见的一些导包的场景. 前言 --project //项目目录 | build.gradle //项目的gradle配置文件 | settings.gradle

iOS 项目中用到的一些开源库和第三方组件

iOS 项目中用到的一些 iOS 开源库和第三方组件 分享一下我目前所在公司 iOS 项目中用到的一些 iOS 开源库和第三方组件, 感谢开源, 减少了我们的劳动力, 节约了我们大量的时间, 让我们有更多的时间和精力能更加专注的做好自己的产品 用到的组件 1.通过CocoaPods安装 项目名称 项目信息 AFNetworking 网络请求组件 FMDB 本地数据库组件 SDWebImage 多个缩略图缓存组件 UICKeyChainStore 存放用户账号密码组件 Reachability 监

如何在Android Studio项目中导入开源库?

前两天,谷歌发布了Android Studio 1.0的正式版,也有更多的人开始迁移到Android Studio进行开发.然而,网上很多的开源库,控件等还是以前的基于Eclipse进行开发,很多人不知道怎么导入到自己的基于Android Studio项目中来,微博上也有人私信我,让我来写写,正好今天回来的比较早,就写写吧.主要介绍一下常见的一些导包的场景. 前言 --project //项目目录 | build.gradle //项目的gradle配置文件 | settings.gradle

给项目加入SlidingMenu开源库

这篇文章直接开始了项目,这里我们要在我们的项目里面加入开源的SlideMenu来提高我们的开发效率,但是加入开源库的时候会问题,下面是jar引入和问题的解决方法. 1.新建项目 2.到github上下载SlideMenu,并吧Library这个文件夹也就是库文件导入Eclipse.右击工程,在properties里面把库引入到工程中. 3.这时候我们会发现控制台出现了一下错误,我们一起来分析和解决这些错误. (1) Found 3 versions of android-support-v4.j