
Adapter相关(打造万能适配器)
发布日期:2021-05-14 18:05:10
浏览次数:19
分类:精选文章
本文共 6227 字,大约阅读时间需要 20 分钟。
目录
相关视频:
相关文章:
(2015年03月02日)
(2014年08月28日)
代码:
ViewHolder.java
public class ViewHolder { private SparseArraymViews; private int mPosition; private View mConvertView; public ViewHolder(Context context, ViewGroup parent, int layoutId, int position) { this.mPosition = position; this.mViews = new SparseArray<>(); this.mConvertView = LayoutInflater.from(context).inflate(layoutId, parent, false); mConvertView.setTag(this); } public static ViewHolder get(Context context, View convertView, ViewGroup parent, int layoutId, int position) { if (convertView == null) { return new ViewHolder(context, parent, layoutId, position); } else { ViewHolder holder = (ViewHolder) convertView.getTag(); holder.mPosition = position; return holder; } } /** * 通过viewId 获取控件 * * @param viewId * @param * @return */ public T getView(int viewId) { View view = mViews.get(viewId); if (view == null) { view = mConvertView.findViewById(viewId); mViews.put(viewId, view); } return (T) view; } public View getConvertView() { return mConvertView; } /** * 设置TextView的值 */ public ViewHolder setText(@IdRes int viewId, String text) { TextView tv = getView(viewId); tv.setText(text); return this; } public ViewHolder setText(@IdRes int viewId,@StringRes int strId) { TextView tv = getView(viewId); tv.setText(strId); return this; } public ViewHolder setTextColor(@IdRes int viewId, @ColorInt int textColor) { TextView view = (TextView)this.getView(viewId); view.setTextColor(textColor); return this; } /** * 设置ImageView的值 */ public ViewHolder setImageResource(@IdRes int viewId, @DrawableRes int imageResId) { ImageView view = this.getView(viewId); view.setImageResource(imageResId); return this; } public ViewHolder setImageDrawable(@IdRes int viewId, Drawable drawable) { ImageView view = (ImageView)this.getView(viewId); view.setImageDrawable(drawable); return this; } public ViewHolder setImageBitmap(@IdRes int viewId, Bitmap bitmap) { ImageView view = (ImageView)this.getView(viewId); view.setImageBitmap(bitmap); return this; } /** * 背景属性 */ public ViewHolder setBackgroundColor(@IdRes int viewId, @ColorInt int color) { View view = this.getView(viewId); view.setBackgroundColor(color); return this; } public ViewHolder setBackgroundRes(@IdRes int viewId, @DrawableRes int backgroundRes{ View view = this.getView(viewId); view.setBackgroundResource(backgroundRes); return this; } /** * 隐藏、显示 */ public ViewHolder setGone(@IdRes int viewId, boolean visible) { View view = this.getView(viewId); view.setVisibility(visible?0:8); return this; } public ViewHolder setVisible(@IdRes int viewId, boolean visible) { View view = this.getView(viewId); view.setVisibility(visible?0:4); return this; }}
CommonAdapter.java
public abstract class CommonAdapterextends BaseAdapter { protected Context mContext; protected List mDatas; protected LayoutInflater mInflater; public CommonAdapter(Context context, List datas) { this.mContext = context; mInflater = LayoutInflater.from(context); this.mDatas = datas; } @Override public int getCount() { return mDatas.size(); } @Override public T getItem(int position) { return mDatas.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = ViewHolder.get(mContext, convertView, parent, R.layout.item_list_view, position); convert(holder, getItem(position)); return holder.getConvertView(); } public abstract void convert(ViewHolder holder, T t);}
使用:
CommonAdapteradapter = new CommonAdapter (Test1Activity.this, mDatas) { @Override public void convert(ViewHolder holder, Bean bean) { holder.setText(R.id.tv_title, bean.getTitle()) .setText(R.id.tv_desc, bean.getDesc()) .setText(R.id.tv_time, bean.getTime()) .setText(R.id.tv_phone, bean.getPhone()); } }; mListView.setAdapter(adapter);
或者:
public class MyAdapter2 extends CommonAdapter{ public MyAdapter2(Context context, List datas) { super(context, datas); } @Override public void convert(ViewHolder holder, Bean bean) { holder.setText(R.id.tv_title, bean.getTitle()) .setText(R.id.tv_desc, bean.getDesc()) .setText(R.id.tv_time, bean.getTime()) .setText(R.id.tv_phone, bean.getPhone());// ((TextView) holder.getView(R.id.tv_title)).setText(bean.getTitle());// ((TextView) holder.getView(R.id.tv_desc)).setText(bean.getDesc());// ((TextView) holder.getView(R.id.tv_time)).setText(bean.getTime());// ((TextView) holder.getView(R.id.tv_phone)).setText(bean.getPhone()); }}
ListView常见问题:
1、Item控件抢占焦点:
例如,Item中有CheckBox控件,该控件就会导致Item触发不了点击事件。
解决办法一:给CheckBox设置属性:android:focusable="false" 解决办法二:给父布局设置属性:android:descendantFocusability="blocksDescendants"为什么会出现焦点抢占的问题呢,可以从源码角度进行分析:
AbsListView --> onTouchEvent() --> MotionEvent.ACTION_UP: -->
if (inList && !child.hasExplicitFocusable()) { if (mPerformClick == null) { mPerformClick = new PerformClick(); } final AbsListView.PerformClick performClick = mPerformClick;}
!child.hasExplicitFocusable() 可以看到只有在子空间没有获取焦点的时候事件才能往下传递。
2、ListView使用CheckBox会导致数据错乱问题,原因是数据复用。
解决办法一:在Bean中设置一个参数 private boolean isChecked; 用来实时记录CheckBox的checked状态。
解决办法二:使用集合记录CheckBox的checked状态。
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2025年04月11日 15时56分17秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
【编程】C语言入门:1到 100 的所有整数中出现多少个数字9
2019-03-09
MySQL----基础及常用命令
2019-03-09
flink启动(二)
2019-03-09
前端开发进阶手册.pdf
2019-03-09
软件架构设计和MESH经验之谈
2019-03-09
关于宝塔面板安装的mysql用Navicat连接出现2003的错误解决
2019-03-09
Windows2016 FTP用户隔离
2019-03-09
js传入参数是中文的时候出现 “******”未定义错误
2019-03-09
吴恩达机器学习课程笔记(英文授课) Lv.1 新手村(回归)
2019-03-09
pair的用法
2019-03-09
SQL基本操作命令
2019-03-09
C# WinForm程序退出的方法
2019-03-09
onFailure unexpected end of stream
2019-03-09
Flex 布局的自适应子项内容过长导致其被撑大问题
2019-03-09
PL/SQL 动态Sql拼接where条件
2019-03-09
Lua-table 一种更少访问的安全取值方式
2019-03-09
虚函数
2019-03-09
斐波那契数列两种算法的时间复杂度
2019-03-09
【自学Flutter】4.1 Material Design字体图标的使用(icon)
2019-03-09