Listview的适配器封装
2015-06-02 10:16
316 查看
ListView的适配器相信大家都写过太多遍了,继承BaseAdapter抽象类,重写getCount,getItem,getItemId,getView方法。为了让汽配器提高效率还要
使用ViewHolder存储convertView中的控件。其大多代码都是重复的,只有一小部分代码是不一样的。因此我么可以封装一下,就不用在写那些冗余的代码了!
自定义的ViewHolder:
自定义BaseListAdapter:
使用方法:
只要重写一个方法是不是简单多了!
使用ViewHolder存储convertView中的控件。其大多代码都是重复的,只有一小部分代码是不一样的。因此我么可以封装一下,就不用在写那些冗余的代码了!
自定义的ViewHolder:
package com.example.getmynumber.adapter; import android.content.Context; import android.util.SparseArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class ViewHolder { //承载ItemView中各个控件的容器,类似于Map,不过其键值只能是Integer类型 private SparseArray<View> mViews; private View convertView; public ViewHolder(Context context, int position, ViewGroup parent, int itemLayoutId) { mViews = new SparseArray<View>(); // 为viewHolder绑定到convertView convertView = LayoutInflater.from(context).inflate(itemLayoutId, parent, false); convertView.setTag(this); } /** * 拿到一个ViewHolder对象 * * @param context * @param convertView * @param parent * @param itemLayoutId * @param position * @return */ public static ViewHolder getViewHolder(Context context, int position, View convertView, ViewGroup parent, int itemLayoutId) { if (convertView == null) { return new ViewHolder(context, position, parent, itemLayoutId); } else { return (ViewHolder) convertView.getTag(); } } /** * 根据控件id获得控件 * 方法泛型 * @param viewId * @return */ public <T extends View> T getView(int viewId) { View view = mViews.get(viewId); if (view == null) { view = convertView.findViewById(viewId); mViews.put(viewId, view); } return (T) view; } /** * 获得convertView; * @return */ public View getConvertView() { return convertView; } }
自定义BaseListAdapter:
package com.example.getmynumber.adapter; import java.util.ArrayList; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; public abstract class BaseListAdapter<T> extends BaseAdapter { private Context context; private LayoutInflater mInflater; private ArrayList<T> mValues; private int itemLayoutId; public BaseListAdapter(Context context, ArrayList<T> mValues, int itemLayoutId) { this.context = context; // item布局id this.itemLayoutId = itemLayoutId; if (mValues == null) { this.mValues = new ArrayList<T>(); } else { this.mValues = mValues; } mInflater = LayoutInflater.from(context); } @Override public int getCount() { return mValues.size(); } @Override public Object getItem(int position) { return mValues.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder helper = ViewHolder.getViewHolder(context, position, convertView, parent, itemLayoutId); convert(helper, mValues.get(position)); return helper.getConvertView(); } // 需要重写的唯一方法 public abstract void convert(ViewHolder helper, T item); }
使用方法:
myAdapter=new BaseListAdapter<String>(CustomListViewActivity.this, citys, R.layout.ll_item) { @Override public void convert(ViewHolder helper, String item) { TextView tv_item=helper.getView(R.id.tv_item); tv_item.setText(item); } };
只要重写一个方法是不是简单多了!
相关文章推荐
- crontab 指定执行用户
- Cisco OSPF常见问题
- PowerShell在控制台输出特殊符号的方法
- Python 正则表达式操作指南
- rtmp流媒体编程相关整理2013(crtmpserver,rtmpdump,x264,faac)
- ftp和tftp区别
- js与bootstrap标签页冲突
- crontab定时运行git命令 更新代码库
- 未在本地计算机上注册 Microsoft.Jet.OLEDB.4.0 提供程序
- BIT_COUNT()&BIT_OR()
- oracle 开机自动启动
- 面试常见问题:如何加密Web项目中配置文件中的密码?
- TreeView 循环加载数据
- 使用git代替FTP部署代码到服务器的例子
- C# 数据结构
- 堆栈、栈针
- 5月国内网站流量统计TOP5:淘宝险胜搜狗获季军
- PDF合同模板项目----问题列表
- redis之RDB持久化策略
- page,request,session,application作用范围