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

Android 通过ViewHolder优化适配器的实现方法(必看)

程序员文章站 2023-01-21 10:11:53
adapter类的定义: adapter对象是adapterview和底层数据见的桥梁。adapter用于访问数据项,并且负责为数据项生成视图 adapterview是...

adapter类的定义:

adapter对象是adapterview和底层数据见的桥梁。adapter用于访问数据项,并且负责为数据项生成视图

adapterview是一个抽象类,用于那些需要通过adapter填充自身的视图,其常见子类是listview。显示adapterview时会调用adapter的getview()方法创建并添加每个子条目的视图。adapter的getview()方法就是用来创建这些视图的,adapter并不会为每行数据都创建一个新视图,而是提供了回收旧视图的方法。运行机制简单说就是当getview()方法被调用是,如果convertview参数不为null,就使用convertview,不用新建视图,通过convertview.findviewbyid()方法获取每个ui控件的引用,然后使用与当前项的位置绑定的数据来填充视图

为了优化,使用viewholder模式,viewholder是一个静态类,可以用于保存每行的视图以避免每次调用getview时都会调用findviewbyid()

Android 通过ViewHolder优化适配器的实现方法(必看)

public class hack25activity extends listactivity {
  private static final int model_count = 30;
  @override
  protected void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    setlistadapter(new modeladapter(this, 0, buildmodels()));
  }

  private list<model> buildmodels() {
    final arraylist<model> ret = new arraylist<model>(model_count);
    for (int i = 0; i < model_count; i++) {
      final model model = new model();
      model.setimage(r.mipmap.ic_launcher);
      model.settext1("name " + i);
      model.settext2("description " + i);
      ret.add(model);
    }
    return ret;
  }
}

model.java

public class model {

 private string mtext1;
 private string mtext2;
 private int mimageresid;

 public string gettext1() {
  return mtext1;
 }

 public void settext1(string text1) {
  mtext1 = text1;
 }

 public string gettext2() {
  return mtext2;
 }

 public void settext2(string text2) {
  mtext2 = text2;
 }

 public int getimage() {
  return mimageresid;
 }

 public void setimage(int imageresid) {
  mimageresid = imageresid;
 }
}

modeladapter.java

public class modeladapter extends arrayadapter<model> {

 private layoutinflater minflater;

 public modeladapter(context context, int textviewresourceid,
   list<model> objects) {
  super(context, textviewresourceid, objects);
  minflater = layoutinflater.from(context);
 }

 @override
 public view getview(int position, view convertview, viewgroup parent) {
  final viewholder viewholder;

  if (convertview == null) {
   convertview = minflater.inflate(r.layout.row_layout, parent,
     false);

   viewholder = new viewholder();
   viewholder.imageview = (imageview) convertview
     .findviewbyid(r.id.image);
   viewholder.text1 = (textview) convertview
     .findviewbyid(r.id.text1);
   viewholder.text2 = (textview) convertview
     .findviewbyid(r.id.text2);

   convertview.settag(viewholder);

  } else {
   viewholder = (viewholder) convertview.gettag();
  }

  model model = getitem(position);
  viewholder.imageview.setimageresource(model.getimage());
  viewholder.text1.settext(model.gettext1());
  viewholder.text2.settext(model.gettext2());

  return convertview;
 }

 private static class viewholder {
  public imageview imageview;
  public textview text1;
  public textview text2;
 }
}

row_layout.xml

<?xml version="1.0" encoding="utf-8"?>

<relativelayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content" >

  <imageview
    android:id="@+id/image"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignparentleft="true"
    android:layout_centervertical="true" />

  <linearlayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_centervertical="true"
    android:layout_torightof="@id/image"
    android:orientation="vertical" >

    <textview
      android:id="@+id/text1"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content" />

    <textview
      android:id="@+id/text2"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content" />
  </linearlayout>

</relativelayout>

以上代码就基本实现了功能

不过每次都自定义viewholder比较繁琐,在网上找了一个工具类,共享一下

viewholder.java

public class viewholder {
  public static <t extends view> t get(view view, int id) {
    sparsearray<view> viewholder = (sparsearray<view>) view.gettag();
    if (viewholder == null) { 
      viewholder = new sparsearray<view>(); 
      view.settag(viewholder); 
    } 
    view childview = viewholder.get(id); 
    if (childview == null) { 
      childview = view.findviewbyid(id); 
      viewholder.put(id, childview); 
    } 
    return (t) childview; 
  } 
} 

使用方法:

  @override 
  public view getview(int position, view convertview, viewgroup parent) { 

    if (convertview == null) { 
      convertview = layoutinflater.from(context) 
       .inflate(r.layout.banana_phone, parent, false); 
    } 

    imageview bananaview = viewholder.get(convertview, r.id.banana); 
    textview phoneview = viewholder.get(convertview, r.id.phone); 

    bananaphone bananaphone = getitem(position); 
    phoneview.settext(bananaphone.getphone()); 
    bananaview.setimageresource(bananaphone.getbanana()); 

    return convertview; 
  } 


以上这篇android 通过viewholder优化适配器的实现方法(必看)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。