Adapter相关(打造万能适配器)
发布日期:2021-05-14 18:05:10 浏览次数:19 分类:精选文章

本文共 6227 字,大约阅读时间需要 20 分钟。

目录


相关视频:

相关文章:

 (2015年03月02日)

(2014年08月28日)

代码:

ViewHolder.java

public class ViewHolder {    private SparseArray
mViews; 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 CommonAdapter
extends 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);}

使用:

CommonAdapter
adapter = 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状态。

 

上一篇:帮百度AI干脏活累活的公司,都死了
下一篇:华为老手机升级系统

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2025年04月11日 15时56分17秒