日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android BaseAdapter和ViewHolder 优化 解决ListView的item抢焦点问题和item错乱问题

發布時間:2025/4/14 Android 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android BaseAdapter和ViewHolder 优化 解决ListView的item抢焦点问题和item错乱问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

首先贊下hyman大神

曾經僅僅是簡單的重寫個BaseAdapter,將getView方法保持抽象。而ViewHolder沒有抽象過。

。。


ViewHolder (用了一個集合+泛型管理存取view)

/*** author : stone* email : aa86799@163.com* time : 15/7/24 14 27*/ public class StoneViewHolder {private int mPosition;private View mConvertView;private SparseArray<View> mViews; //管理listView-item中的viewpublic StoneViewHolder(Context context, int layoutId, int position, ViewGroup parent) {this.mPosition = position;this.mConvertView = LayoutInflater.from(context).inflate(layoutId, parent, false);this.mConvertView.setTag(this);this.mViews = new SparseArray<View>();}public View getConvertView() {return mConvertView;}public static StoneViewHolder getInstance(Context context, int layoutId, int position, ViewconvertView, ViewGroup parent) {if (convertView == null) {return new StoneViewHolder(context, layoutId, position, parent);} else {StoneViewHolder holder = (StoneViewHolder) convertView.getTag();holder.mPosition = position; //更新復用的convertView中 positionreturn holder;}}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;}public <T> void setTag(int viewId, T tag) {getView(viewId).setTag(tag);}public <T> T getTag(int viewId) {return (T) getView(viewId).getTag();}/*------------------------ 設置view屬性(以后擴展) --------------------------------*/public StoneViewHolder setText(int viewId, String text) {((TextView)getView(viewId)).setText(text);return this;}public StoneViewHolder setText(int viewId, int resId) {//R.string.((TextView)getView(viewId)).setText(resId);return this;}public StoneViewHolder setImageBitmap(int viewId, Bitmap bitmap) {((ImageView)getView(viewId)).setImageBitmap(bitmap);return this;}public StoneViewHolder setImageResource(int viewId, int resId) {((ImageView)getView(viewId)).setImageResource(resId);return this;} }
Adapter

/*** author : stone* email : aa86799@163.com* time : 15/7/24 14 46*/ public abstract class StoneListAdapter<T> extends BaseAdapter {private List<T> mData;private Context mContext;private int mLayoutID;public StoneListAdapter(Context context, int layoutID, List<T> data) {this.mContext = context;this.mLayoutID = layoutID;this.mData = data == null ? new ArrayList<T>() : data;}@Overridepublic int getCount() {return mData.size();}@Overridepublic T getItem(int position) {return mData.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {StoneViewHolder holder = StoneViewHolder.getInstance(mContext, mLayoutID, position,convertView, parent);getView(mContext, holder, position);return holder.getConvertView();}protected abstract void getView(Context context, StoneViewHolder holder, int position);}
在ListViewActivity中使用

stoneBaseAdapter = new StoneListAdapter<User>(ListViewActivity.this, R.layout.activity_listview_item, mData) {@Overrideprotected void getView(Context context, final StoneViewHolder holder, final int position) {User user = getItem(position);holder.setText(R.id.tv_id, user.getId()).setText(R.id.tv_name, user.getName()).setText(R.id.tv_age, user.getAge() + "");holder.getView(R.id.btn_test).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {}});} };


關于Adapter中View搶焦點

?假設 listView.setOnItemClickListener(listener); ? 且item中的 ?button.setOnClickListener(listener);?

?無論怎么點擊,button會一直被觸發...

?僅僅須要在item的root-layout中 加入 一個屬性: ??android:descendantFocusability="blocksDescendants"


關于item-view復用后。顯示混亂:

有時條目過多,滑動到下一屏數據時。有些view復用后,view的狀態(比方CheckBox的選種狀態。ImageView的圖片反復出現)會變亂。

一般處理呢。須要有一個機制,來管理一種相應關系: 當前position相應哪種狀態

比方說checkBox選中狀態混亂:

? ?

class MyAdapter extends StoneListAdapter<User> {private SparseBooleanArray mCheckStateArray;public MyAdapter(Context context, int layoutID, List data) {super(context, layoutID, data);this.mCheckStateArray = new SparseBooleanArray();}public void setChecked(int position, boolean isChecked) {mCheckStateArray.put(position, isChecked);}public boolean isChecked(int position) {return mCheckStateArray.get(position);}@Overrideprotected void getView(Context context, final StoneViewHolder holder, final int position) {CheckBox cb = holder.getView(R.id.cb_check);cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {setChecked(position, isChecked);//記錄狀態。防緩存顯示}});cb.setChecked(isChecked(position));}}

關于SparseArray

?SparseArray 內部實現是Array數組。當長度不夠時,會調用System.arrayCopy
? ? ? ? 內部有 keys和values兩個數組。


? ? ? ? put(key, value); 二分法查找key應該存放的位置 ?由于key是Integer類型
? ? ? ? put、get時 兩個數組都是操作的同一個位置上的數據


? ? SparseArray 用于替代形如 ?HashMap<Integer, Object>
? ? SparseBooleanArray 用于替代形如 ?HashMap<Integer, Boolean>
? ? SparseIntArray 用于替代形如 ?HashMap<Integer, Integer>
? ? SparseLongArray 用于替代形如 ?HashMap<Integer, Long>

? support.v4.util.SparseArrayCompat 提供了v4包相應平臺的 SparseArray實現


轉載于:https://www.cnblogs.com/yfceshi/p/6786035.html

總結

以上是生活随笔為你收集整理的Android BaseAdapter和ViewHolder 优化 解决ListView的item抢焦点问题和item错乱问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 91热爆在线| 操极品| 久久免费少妇高潮99精品 | 国产精品69久久久久孕妇欧美 | 天天插天天操 | 国产欧美一区二区三区免费看 | 看全色黄大色黄大片女一次牛 | 伊人中文在线 | 一区二区三区在线观看 | 三级av片| 手机av在线免费观看 | 少妇在线播放 | 欧美成人h版在线观看 | 亚洲av综合永久无码精品天堂 | 中文字幕在线播放日韩 | 在线观看小视频 | 国产一级做a爱免费视频 | 中文字幕综合网 | 操校花视频 | 精品在线观看视频 | 91精品久久久久久久久久久 | 日本成人激情 | 最黄一级片| 色免费看 | 一区二区影院 | 成年视频在线 | 91精产品一区观看 | 黄色小网站在线观看 | 亚洲无码精品免费 | 亚洲一区二区三区影视 | 成人免费在线视频网站 | 日本五十路| 国产91精品在线观看 | 欧美女优在线观看 | 国产青青在线 | 一区二区三区高清不卡 | 久久女人天堂 | 免费视频网站在线观看入口 | 一区二区三区不卡视频在线观看 | 欧美色图俺去了 | 欧美日韩免费观看视频 | 丁香六月激情综合 | 麻豆一区产品精品蜜桃的特点 | av天堂一区二区 | 亚洲综合福利 | 欧美91看片特黄aaaa | 人人插人人看 | 国产一区二区三区精品在线观看 | 欧美激情69 | 国产精品v欧美精品v日韩 | 亚洲最大的黄色网 | 亚洲无限观看 | 诱夫1v1高h | 日本不卡网站 | 美国黄色av| 亚洲精品中文字幕乱码三区91 | 婷婷一级片 | 亚洲干| 国产女人高潮视频 | 国产中文在线 | 欧美日韩在线观看一区二区三区 | 亚洲av成人精品毛片 | 伊人院| 亚洲欲妇 | 亚色网站| 亚洲国产成人在线 | 亚洲人人夜夜澡人人爽 | 亚洲精品1区2区 | 久久6精品 | 亚洲精品va | 在线a网 | 午夜在线精品偷拍 | 国产激情一区二区三区在线观看 | 亚洲最新av | 国产成人在线一区 | 99久久久无码国产 | 国产高清在线观看视频 | 91久久精品一区二区三 | 欧美顶级metart裸体全部自慰 | av站| 国产三级久久 | 亚洲男人第一网站 | 中文字幕被公侵犯的漂亮人妻 | 欧美日韩综合在线观看 | 中国无码人妻丰满熟妇啪啪软件 | 亚洲图片三区 | 五月综合色婷婷 | 天天操中文字幕 | 欧美激情 一区 | 午夜一区二区三区四区 | 国产欧美亚洲一区 | 久热免费| 久久福利国产 | 爆操巨乳美女 | 亚洲综合中文字幕在线 | 色性av| 激情午夜网 | 亚洲短视频 | 成人亚洲区 |