程序员人生 网站导航

通用Adapter与ListView滚动时不加载图片的封装

栏目:综合技术时间:2015-06-12 08:07:10

本文原创,转载请注明链接:http://blog.kymjs.com/

在Android开发中写Adapter是1件非常麻烦的事情,枯燥重复,却又不能不去做。 对Adapter1般都继承BaseAdapter复写几个方法,getView里面使用ViewHolder存储,其实大部份的代码都是类似的。那末本文就带大家1起做1次将Adapter封装成1个通用的Adapter。

关于本文的完全Demo,可以参考KJFrameForAndroid开发框架2.2版本中封装的实例,KJAdapter和AdapterHolder这两个类。
那末接下来我们进入正文,下面这个类似的代码应当是我们看的最多的:

public class EmojiGridAdapter extends BaseAdapter { private List<Emojicon> datas; private final Context cxt; public EmojiGridAdapter(Context cxt, List<Emojicon> datas) { this.cxt = cxt; if (datas == null) { datas = new ArrayList<Emojicon>(0); } this.datas = datas; } public void refresh(List<Emojicon> datas) { if (datas == null) { datas = new ArrayList<Emojicon>(0); } this.datas = datas; notifyDataSetChanged(); } @Override public int getCount() { return datas.size(); } @Override public Object getItem(int position) { return datas.get(position); } @Override public long getItemId(int position) { return position; } private static class ViewHolder { ImageView image; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { holder = new ViewHolder(); ...... convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.image.setImageResource(datas.get(position).getResId()); return convertView; }}


初步抽取

其中BaseAdapter的4个方法必须写,但是基本上前3个都是1模1样的, 所以可使用泛型,写1个基类出来,把数据封装到基类里面,只需要构造方法传入就好了

public class KJBaseAdapter<T> extends BaseAdapter { List<T> datas; KJBaseAdapter(Context cxt,List<T> datas){ ...... } @Override public int getCount() { return datas.size(); } @Override public Object getItem(int position) { return datas.get(position); } @Override public long getItemId(int position) { return position; }}

然后是我们唯1需要动脑的getView()方法,首先是判断converView是不是空,然后载入item布局,然后ViewHolder挨个初始化控件,然后通过tag保存holder,最后设置View的显示。

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐