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

RecyclerView的简单使用

我是想做个日历应用的,发现需要用到RecyclerView,之前也经常用但是还是会忘记,所以还是把它写下来吧~~~haha

1.导入依赖库

首先导入依赖

compile 'com.android.support:recyclerview-v7:23.1.1'

这里写图片描述


2.XML布局文件

在xml中写入

        <android.support.v7.widget.RecyclerView
            android:id="@+id/rvCalendar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

        </android.support.v7.widget.RecyclerView>

这里写图片描述


在layout文件夹下新建recyclerview_item文件

这里写图片描述


3.继承RecyclerView.Adapter

写最重要的Adapter类,这次不用再继承BaseAdapter了,直接继承RecyclerView.Adapter,实现需要重写的方法即可;再也不需要自己重写getView方法,自己做缓存了,RecyclerView都给我们封装好了

这里写图片描述

public class RvAdapterTemplate extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //在这里关联布局文件,生成view对象
        return null;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        //在这里绑定数据
    }

    @Override
    public int getItemCount() {
        return 0;//得到数量
    }
}

当然别忘了构造方法

private Context context;//上下文
private List<Map<String, Object>> datas;//数据列表,为了实现最灵活的数据,使用list嵌套map的方式

    public RvCalendarAdapter(Context context, List<Map<String, Object>> datas) {
        this.context = context;
        this.datas = datas;
    }

写ViewHolder内部类,直接继承RecyclerView.ViewHolder即可

    protected class MyViewHolder extends RecyclerView.ViewHolder {

        protected LinearLayout llDate;
        protected TextView tvDate, tvLunarDate;

        public MyViewHolder(View itemView) {
            super(itemView);

            //initView
            llDate = (LinearLayout) itemView.findViewById(R.id.llDate);
            tvDate = (TextView) itemView.findViewById(R.id.tvDate);
            tvLunarDate = (TextView) itemView.findViewById(R.id.tvLunarDate);

            //initEvent
            llDate.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                }
            });
        }
    }

然后在onCreateViewHolder中获取ViewHolder的实例

MyViewHolder viewHolder = new MyViewHolder(LayoutInflater.from(context).inflate(R.layout.recyclerview_item_calendar, parent, false));//关联布局
return viewHolder;

在onBindViewHolder中绑定数据

    //Map中的字段值,写在常量中方便更改
    public static final String TV_DATE = "tvDate";
    public static final String TV_LUNAR_DATE = "tvLunarDate";

    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        MyViewHolder viewHolder = (MyViewHolder) holder;//强制转换下
        viewHolder.tvDate.setText((String) datas.get(position).get(TV_DATE));
        viewHolder.tvLunarDate.setText((String) datas.get(position).get(TV_LUNAR_DATE));
    }

返回数据列表的大小

public int getItemCount() {
        return datas.size();
    }

这样Adapter已经写好了。


4.在程序中调用

RecyclerView比较其他两个类似的view多了一个setLayoutManager方法,用这个方法既可以实现listView的布局也可以实现GridView的布局,更牛的是还能实现瀑布流的布局!这个在以前是很麻烦的。。

不过它没有点击事件,只能自己写。。。

代码中省略部分无关代码。。。。。。

public class CalendarFragment extends Fragment {

    private RecyclerView rvCalendar;//RecyclerView的实例
    private RvCalendarAdapter rvCalendarAdapter;//Adapter
    private List<Map<String, Object>> dateList;//数据集

    /**
     * onCreateView
     *
     * @param inflater
     * @param container
     * @param savedInstanceState
     * @return
     */
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_calendar, container, false);
        initView(view);
        initData();
        initEvent();
        return view;
    }

    /**
     * initView
     *
     * @param view
     */
    private void initView(View view) {
        rvCalendar = (RecyclerView) view.findViewById(R.id.rvCalendar);//获得实例
    }

    /**
     * initData
     */
    private void initData() {
        dateList = new ArrayList<>();//初始化数据集
        for (int i = 0; i < 30; i++) {
            addDatasToDateList("14", "初五");//循环添加测试数据
        }
        //rvCalendar.setLayoutManager(new LinearLayoutManager(this.getActivity()));//设置为线性布局,listView既视感
        rvCalendar.setLayoutManager(new GridLayoutManager(this.getActivity(), 7));//设置网格布局,gridView既视感
        rvCalendarAdapter = new RvCalendarAdapter(this.getActivity(), dateList);
        rvCalendar.setAdapter(rvCalendarAdapter);
    }

    /**
     * initEvent
     */
    private void initEvent() {

    }

    /**
     * 往dateList中填数据
     *
     * @param date
     * @param lunarDate
     */
    private void addDatasToDateList(String date, String lunarDate) {
        Map<String, Object> map = new HashMap<>();
        map.put(RvCalendarAdapter.TV_DATE, date);
        map.put(RvCalendarAdapter.TV_LUNAR_DATE, lunarDate);
        dateList.add(map);
    }
}

就这样,一个RecyclerView就能用了~

下面是效果图
这里写图片描述

点击事件,添加分割线,添加headView,footView和下拉刷新就以后有时间在写咯~

相关文章:

  • 冒泡排序
  • 快速排序
  • HttpURLConnection官方文档翻译
  • android studio中xml文件代码提示问题
  • Android相机开发那些坑
  • ART、JIT、AOT、Dalvik之间有什么关系?
  • SharedPreference在使用过程中有什么注意点?
  • Android内存优化(使用SparseArray和ArrayMap代替HashMap)
  • Android中的观察者模式简单使用
  • Android内存泄漏总结
  • Android易混淆缩写笔记
  • Android将Log写入文件
  • Android 5.0(Lollipop)中的SurfaceTexture,TextureView, SurfaceView和GLSurfaceView
  • Cygwin的安装
  • Android Studio使用技巧
  • [PHP内核探索]PHP中的哈希表
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • Hibernate最全面试题
  • JavaScript 基本功--面试宝典
  • JavaScript 奇技淫巧
  • Java知识点总结(JavaIO-打印流)
  • js写一个简单的选项卡
  • NSTimer学习笔记
  • Redis在Web项目中的应用与实践
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • 搞机器学习要哪些技能
  • 力扣(LeetCode)22
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 双管齐下,VMware的容器新战略
  • 通过几道题目学习二叉搜索树
  • 运行时添加log4j2的appender
  • 树莓派用上kodexplorer也能玩成私有网盘
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • (1) caustics\
  • (1)(1.13) SiK无线电高级配置(五)
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (第61天)多租户架构(CDB/PDB)
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (九)信息融合方式简介
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (七)Java对象在Hibernate持久化层的状态
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)iOS字体
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • .NET 命令行参数包含应用程序路径吗?
  • .NET 使用 XPath 来读写 XML 文件
  • .net访问oracle数据库性能问题
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!