欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android 中RecyclerView通用适配器的实现

程序员文章站 2022-06-30 08:30:24
android 中recyclerview通用适配器的实现 前言: sdk的5.0版本出来已经n久了,可以说是已经经过许多人的检验了,里面的新控件不能说是非常完美,但也...

android 中recyclerview通用适配器的实现

前言:

sdk的5.0版本出来已经n久了,可以说是已经经过许多人的检验了,里面的新控件不能说是非常完美,但也是非常好用了,其中最让我喜爱的就是recyclerview了,可以完美替代listview和gridview(除了添加headerview和footview了,网上有许多解决方式。这个下面会以一种简单的方式顺带解决,肯定为大家省心),而且可以代码动态切换这两种布局方式以及瀑布流布局。相关切换方式网上有很多,大家自行搜索,我就不贴连接了。

相信大家在之前使用listview时肯定一直很厌烦重复编写无数的adapter,当然有那么一部分机智如我的人肯定一直使用着万能适配器。然而recyclerview要求我们必须使用viewholder来实现adapter。这就让许多用惯了万能适配器的人不爽了。今天我就提供一直基于listview万能适配器的实现原理来改良实现的recyclerview的通用适配器,由于不是教学,切代码比较简单,就不分段讲解了,相信大家看注释就能看懂。

一共两个类,一个是继承了系统的android.support.v7.widget.recyclerview.viewholder所实现的rviewholder类,通过他实现任意控件的缓存一个是继承了android.support.v7.widget.recyclerview.adapter所实现的rbaseadapter类。

实现代码:

rviewholder

import android.content.context;
import android.graphics.bitmap;
import android.support.v7.widget.recyclerview.viewholder;
import android.util.sparsearray;
import android.view.layoutinflater;
import android.view.view;
import android.view.viewgroup;
import android.widget.imageview;
import android.widget.textview;

public class rviewholder extends viewholder {

 private context mcontext;
 private view mconvertview;
 private sparsearray<view> mviews;

 public rviewholder(view itemview) {
  super(itemview);
  mconvertview = itemview;
  this.mviews = new sparsearray<view>();
 }

 public static rviewholder get(context context, viewgroup parent, int layoutid, int position) {
  view view = layoutinflater.from(context).inflate(layoutid, parent, false);
  return new rviewholder(view);
 }

 /**
  * 通过控件的id获取对于的控件,如果没有则加入views
  * 
  * @param viewid
  * @return
  */
 public <t extends view> t getview(int viewid) {

  view view = mviews.get(viewid);
  if (view == null) {
   view = mconvertview.findviewbyid(viewid);
   mviews.put(viewid, view);
  }
  return (t) view;
 }

 /**
  * 为textview设置字符�?
  * 
  * @param viewid
  * @param text
  * @return
  */
 public viewholder settext(int viewid, string text) {
  textview view = getview(viewid);
  view.settext(text);
  return this;
 }

 /**
  * 为imageview设置图片
  * 
  * @param viewid
  * @param drawableid
  * @return
  */
 public viewholder setimageresource(int viewid, int drawableid) {
  imageview view = getview(viewid);
  view.setimageresource(drawableid);

  return this;
 }

 /**
  * 为imageview设置图片
  * 
  * @param viewid
  * @param drawableid
  * @return
  */
 public viewholder setimagebitmap(int viewid, bitmap bm) {
  imageview view = getview(viewid);
  view.setimagebitmap(bm);
  return this;
 }

 public view getconvertview() {
  return mconvertview;
 }
}

这里是rbaseadapter

import java.util.arraylist;
import java.util.collection;
import java.util.list;

import android.content.context;
import android.support.v7.widget.recyclerview.adapter;
import android.view.layoutinflater;
import android.view.view;
import android.view.viewgroup;
import android.widget.linearlayout;

public abstract class rbaseadapter<t> extends adapter<rviewholder> {
 private context mcontext;
 private list<t> list;
 protected layoutinflater minflater;
 private int mitemlayoutid;

 public rbaseadapter(context context) {
  // todo auto-generated constructor stub
  this.mcontext = context;
  this.minflater = layoutinflater.from(mcontext);
  this.mitemlayoutid = new linearlayout(mcontext).getid();
  this.list = new arraylist<t>();

 }

 public rbaseadapter(context context, list<t> list) {
  // todo auto-generated constructor stub
  this.mcontext = context;
  this.minflater = layoutinflater.from(mcontext);
  this.mitemlayoutid = new linearlayout(mcontext).getid();
  this.list = list;

 }

 public rbaseadapter(context context, list<t> list, int itemlayoutid) {
  this.mcontext = context;
  this.minflater = layoutinflater.from(mcontext);
  this.mitemlayoutid = itemlayoutid;
  this.list = list;

 }

 public rbaseadapter(context context, int itemlayoutid) {
  this.mcontext = context;
  this.minflater = layoutinflater.from(mcontext);
  this.mitemlayoutid = itemlayoutid;
  this.list = new arraylist<t>();

 }

 public void setitemlayoutid(int itemlayoutid) {
  this.mitemlayoutid = itemlayoutid;
 }

 public list<t> getlist() {
  return this.list;
 }

 public void appendlist(list<t> list) {
  // todo auto-generated method stub
  this.list = list;
  notifydatasetchanged();
 }

 public void addlist(list<t> list2) {
  // todo auto-generated method stub
  this.list.addall((collection<? extends t>) list2);
  notifydatasetchanged();
 }

 @override
 public int getitemcount() {
  return list.size();

 }

 boolean hasheader = false;
 boolean hasfooter = false;
 view headerview;
 view footerview;

 public void setheaderview(view headerview) {
  hasheader=true;
  this.headerview = headerview;
 }

 public void setfooterview(view footerview) {
   hasfooter = true;
  this.footerview = footerview;
 }

 public view getheaderview() {
  return headerview;
 }

 public view getfooterview() {
  return footerview;
 }

 @override
 public void onbindviewholder(rviewholder holder, int position) {
  if (hasheader && position == 0) {
   return;
  } else if (hasfooter && position == (list.size() + (hasheader ? 1 : 0))) {
   return;
  } else
   convert(holder, (t) list.get(position));
 }

 @override
 public rviewholder oncreateviewholder(viewgroup parent, int position) {
  if (hasheader && position == 0) {
   return new rviewholder(headerview);
  } else if (hasfooter && position == (list.size() + (hasheader ? 1 : 0))) {
   return new rviewholder(footerview);
  } else
   return rviewholder.get(mcontext, parent, mitemlayoutid, position);

 }
//这里定义抽象方法,我们在匿名内部类实现的时候实现此方法来调用控件
 public abstract void convert(rviewholder holder, t item);
}

    对于rbaseadapter稍微讲解下,首先是泛型,这样任何对象类型都可以使用,再来就是前面提到的headerview和footerview的解决,可以看到rbaseadapter里面定义了几个方法,通过position的不同来加载不同的布局的思想来添加headerview和footerview。

    activity里面调用

recyclerview.setadapter(new rbaseadapter<virtualwinsbean>(mcontext, r.layout.virtual_win_users_list_item) {

   @override
   public void convert(rviewholder holder, virtualwinsbean item) {
    if (util.checknull(item.getnick_name())) {
     holder.settext(r.id.name, util.hidephone(item.getphone() + ""));
    } else {
     holder.settext(r.id.name, item.getnick_name());
    }
    roundimageview networkimageview = holder.getview(r.id.photo);
    networkimageview.setloadingimage(r.drawable.header_def);
    networkimageview.setdefultimage(r.drawable.header_def);
    networkimageview.loadurl(u.g(item.getfile_url()));
   }
  });

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!