Android推荐几款好用的开源作品二之万能RecyclerView适配器讲解_第1页
Android推荐几款好用的开源作品二之万能RecyclerView适配器讲解_第2页
Android推荐几款好用的开源作品二之万能RecyclerView适配器讲解_第3页
Android推荐几款好用的开源作品二之万能RecyclerView适配器讲解_第4页
Android推荐几款好用的开源作品二之万能RecyclerView适配器讲解_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Android推荐几款好用的开源作品(二) 之万能RecyclerView适配器前言:RecyclerView出现已经有一段时间了,我们肯定不陌生了,可以通过导入support-v7对其进行使用。根据官方的文档,该控件用于在有限的窗口中展示大量数据集,其实有了它就可以替代 ListView、GridView 了。了解RecyclerView 架构,可以高度的解耦,异常的灵活,通过设置它提供的不同 LayoutManager, ItemDecoration , ItemAnimator 可以实现的想要的效果。1、首先介绍几种 LayoutManagerjava view plain copy 在

2、CODE上查看代码片派生到我的代码片LinearLayoutManager mManager = new LinearLayoutManager(mContent);LinearLayoutManager mManager = new LinearLayoutManager(mContent, LinearLayoutManager.VERTICAL, false);/ 垂直布局,true 表示左右翻转,false 不翻转 GridLayoutManager mManager = new GridLayoutManager(mContent,3);GridLayoutManagermManag

3、er=newGridLayoutManager(mContent,3,LinearLayoutManager.HORIZONTAL,false);/ 每行 3 歹U,水平, true表示左右翻转,false不翻转 mRecyclerView.setLayoutManager(mManager);2、RecycleView 简单使用java view plain copy 在CODE上查看代码片派生到我的代码片初始化控件 mRecyclerView = findView(R.id.id_recyclerview);/设置布局管理器mManager = new LinearLayoutManage

4、r(mContent); mRecyclerView.setLayoutManager(mManager);/设置 adapter mRecyclerView.setAdapter(mAdapter)/设置Item增加、移除动画 mRecyclerView.setItemAnimator(new DefaultItemAnimator();/添加分割线mRecyclerView.addItemDecoration(new DividerItemDecoration( getActivity(), DividerItemDecoration.HORIZONTAL_LIST);3、接下来介绍的就是

5、 RecyclerView 的适配器了,同样,RecyclerView 和 ListView , GridView 一样需要 adapter来填充数据,同样,自定义一个 adapter需要继承 RecyclerView.Adapter ,代 码需要实现几个父类方法 onCreateViewHolder , onBindViewHolder , getItemCount(),根据名字 就能知道:(1) onCreateViewHolder :主要返回的是拿到布局,进而返回 ViewHolderreturnnewViewHolder(LayoutInflater.from(parent.getCo

6、ntext().inflate(R.layout.list_cell,null);(2) onBindViewHolder :拿至U ViewHolder中的控件对其赋值操作(3) getItemCount():返回数组的 size()java view plain copy 在CODE上查看代码片派生到我的代码片 public class MyAdapter extends RecyclerView.Adapter class ViewHolder extends RecyclerView.ViewHolder TextView tvTitle,tvContent;public ViewHo

7、lder(View itemView) super(itemView);tvTitle = (TextView) itemView.findViewById(R.id.tv_title);tvContent = (TextView) itemView.findViewById(R.id.tv_content); Overridepublic RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) returnnewViewHolder(LayoutInflater.from(parent.getCon

8、text().inflate(R.layout.list_cell,null); Overridepublic void onBindViewHolder(RecyclerView.ViewHolder holder, int position) ViewHolder vh = (ViewHolder) holder;CellData cd = dataposition;vh.tvTitle.setText(cd.title);vh.tvContent.setText(cd.content);Overridepublic int getItemCount() return data.lengt

9、h;private CellData datanew CellDatanewrecycleview"),new recycleview"),new recycleview"),new recycleview"),new recycleview"),new recycleview"),new recycleview"),newCellData(" CellData(" CellData(" CellData(" CellData(" CellData(" CellDa

10、ta("天气 天气 天气 天气 天气 天气 天气"今天天气不错" "今天天气不错" "今天天气不错" "今天天气不错" "今天天气不错" "今天天气不错" "今天天气不错"),new ),new ),new ),new ),new ),new ),newCellData("recycleview"," CellData("recycleview", CellData("recyclevi

11、ew", CellData("recycleview", CellData("recycleview", CellData("recycleview", CellData("recycleview", CellData("recycleview",学习 学习 学习 学习 学习 学习 学习 学习recycleview"),newCellData("天气","今天天气不错"),newCellData("recycleview&qu

12、ot;,"学习recycleview"),newCellData("天气","今天天气不错"),newCellData("recycleview","学习recycleview"),newCellData("天气","今天天气不错"),newCellData("recycleview","学习recycleview"),newCellData("天气","今天天气不错"),ne

13、wCellData("recycleview","学习recycleview"),newCellData("天气","今天天气不错"),newCellData("recycleview","学习recycleview"),newCellData("天气","今天天气不错"),newCellData("recycleview","学习recycleview"),newCellData("天

14、气","今天天气不错"),newCellData("recycleview","学习recycleview"),newCellData("天气","今天天气不错"),newCellData("recycleview","学习recycleview"),newCellData("天气","今天天气不错"),newCellData("recycleview","学习recyclev

15、iew"),newCellData("天气","今天天气不错"),newCellData("recycleview","学习recycleview"),newCellData("天气","今天天气不错"),newCellData("recycleview","学习recycleview"),newCellData("天气","今天天气不错"),newCellData("recy

16、cleview","学习recycleview"),newCellData("天气","今天天气不错"),newCellData("recycleview","学习recycleview"),newCellData("天气","今天天气不错"),newCellData("recycleview","学习recycleview"),newCellData("天气","今天天气不错

17、"),newCellData("recycleview","学习recycleview"),newCellData("天气","今天天气不错"),newCellData("recycleview","学习recycleview"),newCellData("天气","今天天气不错"),newCellData("recycleview","学习recycleview"),newCellDa

18、ta("天气","今天天气不错"),newCellData("recycleview","学习recycleview"),newCellData("天气","今天天气不错"),newCellData("recycleview","学习recycleview"),new CellData("天气","今天天气不错");)4、效果图,虽然很难看,但是是基本的实现方式。 t 3:26recycle vi

19、ew 学习,fttyckt力cw 天气 Z£ T- -ter Tr CW, *KK.r 不一1 recycleview天气*工工m k k r干海 recycleview 学 ftcycirvww 天气 今天MF不屈 recycle view 事习 rrcErnew 天气 中天天不粗 recycle view 学 Sjfpcyclcview 天气 今天天气不曲 recycleview 孽司 rsyclpwic* 天气 今天天,不铅 recycleview天气 今天天,不fill recycleview 笊可rtcycltm w 天气 小天天气.不?1可见,RecyclerView 和

20、传统的ListView , GridView 使用的流程是一样的,但是由于RecyclerView的高定制性,使用者越来越多,已经有大部分的开发者放弃使用ListView和GridView 了。想要用好 RecyclerView也不难,关键就在于Adapter的书写上,接下来介绍一个非常好用的RecyclerView 万能适配器(BaseRecyclerViewAdapterHelper ),前几天接触到的,感觉十分好用,所包含的功能有以下几个(官网介绍):优化Adapter代码(减少百分之 70%代码) 添加点击item点击、长按事件、以及 item子控件的点击事件 添加加载动画(一行代码轻

21、松切换5种默认动画)添加头部、尾部、下拉刷新、上拉加载(感觉又回到ListView时代)设置自定义的加载更多布局 添加分组(随心定义分组头部) 自定义不同的item类型(简单配置、无需重写额外方法) 设置空布局(比 Listview的setEmptyView还要好用!) 添加拖拽item1、添加item点击、长按事件java view plain copy 在CODE上查看代码片派生到我的代码片 mQuickAdapter.setOnRecyclerViewItemClickListener();mQuickAdapter.setOnRecyclerViewItemLongClickListe

22、ner();2、新增添加子布局多个控件的点击事件Adapterjava view plain copy 在CODE上查看代码片派生到我的代码片 protected void convert(BaseViewHolder helper, Status item) helper.setOnClickListener(R.id.tweetAvatar, new OnItemChildClickListener() .setOnClickListener(R.id.tweetName, new OnItemChildClickListener(); Activity java view plain c

23、opy 在CODE上查看代码片派生到我的代码片 mQuickAdapter.setOnRecyclerViewItemChildClickListener(new BaseQuickAdapter.OnRecyclerViewItemChildClickListener() Override public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) String content = null;Status status = (Status) adapter.getItem(position);

24、 switch (view.getId() case R.id.tweetAvatar: content = "img:" + status.getUserAvatar(); break; case R.id.tweetName: content = "name:" + status.getUserName(); break; Toast.makeText(AnimationUseActivity.this,content,Toast.LENGTH_LONG).show(); ); 3、添加动画 java view plain copy 在CODE上查看

25、代码片派生到我的代码片 / 一行代码搞定(默认为渐显效果) quickAdapter.openLoadAnimation();/默认提供5种方法(渐显、缩放、从下到上,从左到右、从右到左) quickAdapter.openLoadAnimation(BaseQuickAdapter.ALPHAIN);/自定义动画如此轻松 quickAdapter.openLoadAnimation(new BaseAnimation() Override public Animator getAnimators(View view) return new AnimatorObjectAnimator.ofF

26、loat(view, "scaleY", 1, 1.1f, 1),ObjectAnimator.ofFloat(view, "scaleX", 1, 1.1f, 1) ; );4、添加头部和尾部java view plain copy 在CODE上查看代码片派生到我的代码片mQuickAdapter.addHeaderView(getView();mQuickAdapter.addFooterView(getView();5、上拉加载更多java view plain copy 在CODE上查看代码片派生到我的代码片mQuickAdapter.openL

27、oadMore(PAGE_SIZE, true);必须设置 pageSize,否则上拉不会加载, pageSize 一般为每次请求需要加载的数据条数mQuickAdapter.setOnLoadMoreListener(new BaseQuickAdapter.RequestLoadMoreListener() Overridepublic void onLoadMoreRequested() mRecyclerView.post(new Runnable() Override public void run() if (mCurrentCounter >= TOTAL_COUNTER)

28、 mQuickAdapter.notifyDataChangedAfterLoadMore(false); else mQuickAdapter.notifyDataChangedAfterLoadMore(DataServer.getSampleData(PAGE_SIZE), true);mCurrentCounter = mQuickAdapter.getItemCount(); ); );可以通过mQuickAdapter.setLoadingView(customView);自定义加载更多的布局6、使用分组java view plain copy 在CODE上查看代码片派生到我的代码

29、片public class SectionAdapter extends BaseSectionQuickAdapter<MySection> public SectionAdapter(int layoutResId, int sectionHeadResId, List data) super(layoutResId, sectionHeadResId, data);Overrideprotected void convert(BaseViewHolder helper, MySection item) helper.setImageUrl(R.id.iv, (String)

30、item.t);Overrideprotected void convertHead(BaseViewHolder helper,final MySection item) helper.setText(R.id.header, item.header);elsehelper.setOnClickListener(R.id.more, new View.OnClickListener() Overridepublic void onClick(View v) Toast.makeText(context,item.header+"more.",Toast.LENGTH_LO

31、NG).show();) );)7、添加多种类型Itemjava view plain copy 在CODE上查看代码片派生到我的代码片public class MultipleItemQuickAdapter extends BaseMultiItemQuickAdapter<MultipleItem> public MultipleItemQuickAdapter(List data) super(data);addItemType(MultipleItem.TEXT, R.layout.text_view);addItemType(MultipleItem.IMG , R.l

32、ayout.image_view); Overrideprotected void convert(BaseViewHolder helper, MultipleItem item) switch (helper.getItemViewType() case MultipleItem.TEXT:helper.setImageUrl(R.id.tv, item.getContent(); break;case MultipleItem.IMG:helper.setImageUrl(R.id.iv, item.getContent(); break;8、使用 setEmptyViewjava vi

33、ew plain copy 在CODE上查看代码片派生到我的代码片 mQuickAdapter.setEmptyView(getView();9、使用拖拽与滑动删除java view plain copy 在CODE上查看代码片派生到我的代码片 OnItemDragListener onItemDragListener = new OnItemDragListener() Overridepublic void onItemDragStart(RecyclerView.ViewHolder viewHolder, int pos)Overridepublic void onItemDragMo

34、ving(RecyclerView.ViewHolder source, int from, RecyclerView.ViewHolder target, int to) Overridepublic void onItemDragEnd(RecyclerView.ViewHolder viewHolder, int pos) OnItemSwipeListener onItemSwipeListener = new OnItemSwipeListener() Overridepublic void onItemSwipeStart(RecyclerView.ViewHolder viewH

35、older, int pos) Overridepublic void clearView(RecyclerView.ViewHolder viewHolder, int pos) Overridepublic void onItemSwiped(RecyclerView.ViewHolder viewHolder, int pos) ;ItemDragAndSwipeCallbackitemDragAndSwipeCallbacknewItemDragAndSwipeCallback(mAdapter);ItemTouchHelper itemTouchHelper = new ItemTo

36、uchHelper(itemDragAndSwipeCallback);itemTouchHelper.attachToRecyclerView(mRecyclerView);/开启拖拽mAdapter.enableDragItem(itemTouchHelper, R.id.textView, true);mAdapter.setOnItemDragListener(onItemDragListener);/开启滑动删除mAdapter.enableSwipeItem();mAdapter.setOnItemSwipeListener(onItemSwipeListener);感觉每一个功能

37、都很实用,目前也在努力在项目中进行测试使用。需要分页的页面还会RecyclerView 配合ListView 和 GridView最常用的莫过于下拉刷新,上拉加载的,基本每个页面都会用到刷新, 用到加载。曾经搜了下网上的相关于这方面的资源,感觉基本没有将 SwipeRefreshLayout做到很好能刷新和加载的。其他的都是自定义的实现的刷新和加载,由于不太想用 ListView 了,所以就换成了RecyclerView ,闲淡少扯,实战继续。先上图:MOOKMK 电视 U55H3MOOKA4K 电禄 1155H3山拓岛市MOOMW 电寝 U 55H 3MOOKA4K 电视 U55H3i

38、77;> -dR-山飓E ± rpMOOKA4KEE%U55H3L星;前BVMOOKMK 电视 U55H3MOOKMK 晅视 U55Hmi MOOKA4KWU55H3-if* IB I KUIJli需求分析:通过接口返回的数据需要进行分页java view plain copy 在CODE上查看代码片派生到我的代码片("code": 1,"pageCount": 33,"list":("province": "XX 省","city": "XX 市&

39、quot;,"address": "XX 区 XX 路", "scan_time": "2016/7/9 10:30:44", "product_id": "1", "product_name": "MOOKA4K 电视 U55H3”, "product_small_image":" "eancode": "6925876304318", "sn": &qu

40、ot;DH1TV0A0701HUF530144")Adapterjava view plain copy 在CODE上查看代码片派生到我的代码片 public class QuickAdapter extends BaseQuickAdapter<ScanRecordRowEntity> private ImageLoader imageLoader = ImageLoader.getInstance();public QuickAdapter(List<ScanRecordRowEntity> data) super(data);public QuickAd

41、apter(int layoutResId, List<ScanRecordRowEntity> data) super(layoutResId, data);Overrideprotected void convert(BaseViewHolder helper, ScanRecordRowEntity item) helper.setText(R.id.tv_product_name, item.getProduct_name().setText(R.id.tv_time, item.getScan_time().setText(R.id.tv_place, item.getP

42、rovince() + item.getCity();/imageLoader.displayImage(item.getProduct_small_image(), (ImageView)helper.getView(R.id.img_product_logo), ImageLoaderUtils.getDefaultOptions();Glide.with(mContext).load(item.getProduct_small_image().fitCenter().placeholder(R.drawable.ic_product_default).crossFade().into(I

43、mageView) helper.getView(R.id.img_product_logo);Activityjava view plain copy 在CODE上查看代码片派生到我的代码片public class ScanRecordTestActivity extends BaseActivity implementsSwipeRefreshLayout.OnRefreshListener, BaseQuickAdapter.RequestLoadMoreListener private List<ScanRecordRowEntity> list = new ArrayLi

44、st<>();private String encode;private SwipeRefreshLayout mSwipeRefreshLayout;private RecyclerView mRecyclerView;private QuickAdapter mQuickAdapter;private int pageCount = 1; 分页返回总页数private int page = 1;/当前请求页为第一页private int pageSize = 10;/ 每次请求 10 条记录Overrideprotected void initView() setContent

45、View(R.layout.activity_scan_record_test);setBack();setTitle("扫描记录");mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.id_swiperefresh);RefreshUtil.setSwipeRefreshC010r(mSwipeRefreshLayout);/ 设置刷新框颜色 mRecyclerView = (RecyclerView) findViewById(R.id.id_recycleview);mSwipeRefreshLa

46、yout.setOnRefreshListener(this);mRecyclerView.setLayoutManager(new LinearLayoutManager(this);initAdapter();mRecyclerView.setAdapter(mQuickAdapter);private void initAdapter() mQuickAdapter = new QuickAdapter(R.layout.item_scan_record, list);mQuickAdapter.openLdAnimation();mRecyclerView.setAdapter(mQu

47、ickAdapter); mQuickAdapter.setOnLoadMoreListener(this);mQuickAdapter.setOnRecyclerViewItemClickListener(newBaseQuickAdapter.OnRecyclerViewItemClickListener() Overridepublic void onItemClick(View view, int position) Toasters(Integer.toString(position););Overrideprotected void initData() encode = getI

48、ntent().getStringExtra("encode");if (NetUtil.isNetConnected(mContext) RefreshUtil.setSwipeRefreshLoadingState(mSwipeRefreshLayout);/ 设置 首次加 载数据时显示加载框getRecord(); else Toasters("无网络连接!");Overrideprotected void setOnClickEvent() private void getRecord() String url = Constant.GET_SCAN_RECORD + encode +

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论