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()
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优化适配器的实现方法(必看)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
推荐阅读
-
android通过代码的形式来实现应用程序的方法
-
android通过Location API显示地址信息的实现方法
-
Android编程使用加速度传感器实现摇一摇功能及优化的方法详解
-
Android中利用ViewHolder优化自定义Adapter的写法(必看)
-
Android 通过ViewHolder优化适配器的实现方法(必看)
-
android通过代码的形式来实现应用程序的方法
-
Android中通过view方式获取当前Activity的屏幕截图实现方法
-
android通过Location API显示地址信息的实现方法
-
超级简单的android通过view自带的方法进行裁剪视图,实现圆形,矩形和圆角
-
Android中利用ViewHolder优化自定义Adapter的写法(必看)