CommonAdapter-万能的ListView.GridView的适配器
2015-09-17 16:42
381 查看
大家对于ListView的适配器的使用相信十分熟悉,因为在开发工程中。我们需要经常使用他,重复地进行着继承BaseAdapter、写ViewHolder的繁琐的工作。这时,你是否急需一个万能的Adapter能够让我们远离那些繁琐的工作呢? CommonAdapter就能够满足大家的需求。
首先我们还是先来介绍一下listView的使用方法吧。
基本的使用就不说了 就粘一下他的Adapter的写法:
listView的细节设置:
去除掉ListView的缓存颜色的方法,在设置属性那里设置缓存颜色为透明:
设置分割线的颜色以及宽度的方法:
去掉滑动条效果:
下面我们来介绍一下CommonAdapter的使用:
1.首先我们需要定义我们需要创建一个万能的ViewHolder
此处我就不详细接受ViewHolder的使用含义了,不懂的自己问度娘。
我们可以在这个使用这个万能ViewHolder来设置我们的控件的属性,不过这个ViewHolder只是包含了结果通用的控件的属性标签。如果大家有什么特别的属性标签的,可以自己修改代码。如果不懂,可以模仿我在代码中写的那个setTextBg方法来进行修改。
2.定义我们的万能适配器CommonAdapter类:
这个万能适配器是利用前面写好的ViewHolder,利用泛型帮我们处理好了getCount,getItem,getItemId三个方法,我们只需要处理getView方法即可。
3.使用示例
此处是根据我自己的理解进行写的,只是方便以后自己查阅。细节不够详细敬请谅解。
如果大家想要更详细的解释,请访问鸿洋大神的博客:http://blog.csdn.net/lmj623565791/article/details/38902805/
首先我们还是先来介绍一下listView的使用方法吧。
基本的使用就不说了 就粘一下他的Adapter的写法:
<span style="font-size:18px;">import java.util.List; import java.util.Map; import com.aaron.util.R; import android.content.Context; import android.text.Html; import android.text.Spanned; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; /** * @author aaron * */ public class TextSearchAdapter extends BaseAdapter { private LayoutInflater inflater; private String keyword; private PageModel mModel; private Context mContext; List<Map<String, Object>> ItemInfoList; public TextSearchAdapter(Context context, List<Map<String, Object>> ItemInfoList, PageModel pageModel, String keyword) { this.ItemInfoList = ItemInfoList; this.mContext = context; this.mModel = pageModel; this.keyword = keyword; inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); } static class ViewHolder { TextView name; TextView department; TextView content; } /** * [突出显示] * * @param key * @param s * @param color * @return */ private Spanned setKeyColor(String key, String s, String color) { String colorKey = "<font color=\"" + color + "\">" + key + "</font>"; return Html.fromHtml(s.replace(key, colorKey)); } @Override public int getCount() { // TODO Auto-generated method stub return ItemInfoList.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return ItemInfoList.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub ViewHolder holder = null; if (holder == null) { convertView = inflater.inflate(R.layout.listview_item_sql, null); holder = new ViewHolder(); holder.name = (TextView) convertView .findViewById(R.id.list_item_name); holder.department = (TextView) convertView .findViewById(R.id.list_item_department); holder.content = (TextView) convertView .findViewById(R.id.list_item_content); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } String item = (String) ItemInfoList.get(position).get("content"); holder.content.setText(setKeyColor(keyword, item, "red")); holder.name.setText((CharSequence) ItemInfoList.get(position).get( "name")); holder.department.setText((CharSequence) ItemInfoList.get(position) .get("department")); return convertView; } } </span>
listView的细节设置:
去除掉ListView的缓存颜色的方法,在设置属性那里设置缓存颜色为透明:
android:cacheColorHint="#00000000"
设置分割线的颜色以及宽度的方法:
android:divider="#cbcbcb" android:dividerHeight="1dp"
去掉滑动条效果:
android:scrollbars="none" 去掉滑动时listView产生的缓存背景 android:scrollingCache="false"
<ListView android:id="@+id/lv_orderhandler" android:layout_width="match_parent" android:background="#80ECECEC" android:divider="#cbcbcb" android:dividerHeight="1dp" android:cacheColorHint="#00000000"<pre name="code" class="html"> android:scrollbars="none" android:layout_height="match_parent"> </ListView>
下面我们来介绍一下CommonAdapter的使用:
1.首先我们需要定义我们需要创建一个万能的ViewHolder
此处我就不详细接受ViewHolder的使用含义了,不懂的自己问度娘。
我们可以在这个使用这个万能ViewHolder来设置我们的控件的属性,不过这个ViewHolder只是包含了结果通用的控件的属性标签。如果大家有什么特别的属性标签的,可以自己修改代码。如果不懂,可以模仿我在代码中写的那个setTextBg方法来进行修改。
<span style="font-size:18px;">package com.tutu.common.adapter; import android.content.Context; import android.graphics.Bitmap; import android.util.SparseArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.tutu.common.ImageLoader; import com.tutu.common.ImageLoader.Type; public class ViewHolder { private final SparseArray<View> mViews; private int mPosition; private View mConvertView; private ViewHolder(Context context, ViewGroup parent, int layoutId, int position) { this.mPosition = position; this.mViews = new SparseArray<View>(); mConvertView = LayoutInflater.from(context).inflate(layoutId, parent, false); // setTag mConvertView.setTag(this); } /** * 拿到一个ViewHolder对象 * * @param context * @param convertView * @param parent * @param layoutId * @param position * @return */ public static ViewHolder get(Context context, View convertView, ViewGroup parent, int layoutId, int position) { if (convertView == null) { return new ViewHolder(context, parent, layoutId, position); } return (ViewHolder) convertView.getTag(); } public View getConvertView() { return mConvertView; } /** * 通过控件的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; } /** * 为TextView设置背景颜色 * * @param viewId * @param text * @return */ public ViewHolder setTextBg(int viewId, int color) { TextView view = getView(viewId); view.setBackgroundColor(color); 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; } /** * 为ImageView设置图片 * * @param viewId * @param drawableId * @return */ public ViewHolder setImageByUrl(int viewId, String url) { ImageLoader.getInstance(3, Type.LIFO).loadImage(url, (ImageView) getView(viewId)); return this; } public int getPosition() { return mPosition; } }</span>
2.定义我们的万能适配器CommonAdapter类:
这个万能适配器是利用前面写好的ViewHolder,利用泛型帮我们处理好了getCount,getItem,getItemId三个方法,我们只需要处理getView方法即可。
<span style="font-size:18px;"><span style="font-size:18px;">package com.tutu.common.adapter; import java.util.ArrayList; import java.util.List; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; /** * 这是个ListView,GridView共用的adapter类 * * @author chenboling * * @param <T> */ public abstract class CommonAdapter<T> extends BaseAdapter { protected LayoutInflater mInflater; protected Context mContext; protected List<T> mDataSource; protected final int mItemLayoutId; public CommonAdapter(Context context, List<T> list, int itemLayoutId) { this.mContext = context; this.mInflater = LayoutInflater.from(mContext); if (null == list) { list = new ArrayList<T>(); } this.mDataSource = list; this.mItemLayoutId = itemLayoutId; } @Override public int getCount() { return mDataSource.size(); } @Override public T getItem(int position) { return mDataSource.size() == 0 ? null : mDataSource.get(position); } @Override public long getItemId(int position) { return mDataSource.size() == 0 ? 0 : mDataSource.get(position).hashCode(); } @Override public View getView(int position, View convertView, ViewGroup parent) { final ViewHolder viewHolder = getViewHolder(position, convertView, parent); convert(viewHolder, getItem(position)); return viewHolder.getConvertView(); } public abstract void convert(ViewHolder viewHolder, T item); private ViewHolder getViewHolder(int position, View convertView, ViewGroup parent) { return ViewHolder.get(mContext, convertView, parent, mItemLayoutId, position); } /** * 向数据源中动态添加一项 * * @param t */ public void addItem(T t) { if (this.mDataSource == null) { this.mDataSource = new ArrayList<T>(); } this.mDataSource.add(t); this.notifyDataSetChanged(); } /** * 刷新数据源 * * @param newDataSource */ public void refreshDataSource(List<T> newDataSource) { if (null == newDataSource) return; this.mDataSource = newDataSource; this.notifyDataSetChanged(); } }</span></span>
3.使用示例
<span style="font-size:18px;"><span style="font-size:18px;"> lv_store_rderDetail.setAdapter(new CommonAdapter<DetailBean>( getApplicationContext(), mDatas, R.layout.item_store_detail) { @Override public void convert(ViewHolder viewHolder, DetailBean item) { viewHolder.setText(R.id.tv_name_detailItem, item.getName()); viewHolder.setText(R.id.tv_percent_detailItem, item.getPercent()); viewHolder.setTextBg(R.id.tv_color_detailItem, item.getColor()); } });</span></span>
此处是根据我自己的理解进行写的,只是方便以后自己查阅。细节不够详细敬请谅解。
如果大家想要更详细的解释,请访问鸿洋大神的博客:http://blog.csdn.net/lmj623565791/article/details/38902805/
相关文章推荐
- 小甲鱼Python笔记(下)
- MVC中TextBox事件
- 嵌入式裸机编程,对内存管理的一些见解
- 深入解析C++编程中的静态成员函数
- Hebb假设
- jquery实现简单的Tab切换菜单
- Android访问网络,HttpURLConnection还是HttpClient?
- MySQL中用户权限、库权限、表权限的控制
- iOS利用AFNetworking(AFN) 实现图片上传
- 字典类型方法
- 关于符号扩展多少你自己知道
- dot.js-js模板引擎使用,教程,入门
- android第三更(下载附件,通知栏显示进度)
- Looper解析
- linux系统故障排除
- 打包静态库,文章mark
- 复合类型与const关键字
- js 模板引擎 为什么选择 dot
- HDU 1518 Square
- Struts 2 creating own interceptor