ListView优化总结
来源:互联网 发布:java二维数组遍历 编辑:程序博客网 时间:2024/06/16 09:15
1.适配器优化
1.1ViewHolder类封装
1.ViewHolder类原始类
class ViewHolder{ TextView name; TextView age; }
封装类
/** * 封装视图类 * @author nate */public class CommViewHolder{ /** * 视图容器 */ private SparseArray<View> mViews; /** * 位置标识 */ private int mPosition; /** * 视图 */ private View mConvertView; /** * 私有化构造方法,不让外界进行使用 * @param context * @param parent * @param layoutId * @param position */ private CommViewHolder(Context context, ViewGroup parent, int layoutId, int position) { this.mViews = new SparseArray<View>(); this.mConvertView = LayoutInflater.from(context).inflate(layoutId, parent, false); this.mPosition = position; mConvertView.setTag(this); } /** * * @param context * @param parent * @param layoutId * @param position * @param convertView * @return 静态方法获取到viewholder类实例 */ public static CommViewHolder get(Context context, ViewGroup parent, int layoutId, int position, View convertView) { if(convertView == null) { return new CommViewHolder(context, parent, layoutId, position); } else { CommViewHolder holder = (CommViewHolder) convertView.getTag(); // 复用视图,但是position要更新 holder.mPosition = position; return holder; } } /** * * @param viewId 控件id * @return 根据控件id获取到控件 */ @SuppressWarnings("unchecked") 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; } /** * @return 返回视图类 */ public View getmConvertView() { return mConvertView; } /** * @param viewId * @param content * @return 设置textview相关 */ public CommViewHolder setTextView(int viewId, String content) { TextView tv = getView(viewId); tv.setText(content); return this; } // TODO 可以根据自己的需要编写更多适用的方法。。。}
2.Adapter类中Viewholder代码对比使用原始holder
class MyAdapter extends ArrayAdapter<Person> { public MyAdapter(Context context, int resource, List<Person> objects) { super(context, resource, objects); } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if(convertView == null) { holder = new ViewHolder(); convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_layout, null); holder.name = (TextView) convertView.findViewById(R.id.name); holder.age = (TextView) convertView.findViewById(R.id.age); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } Person person = getItem(position); holder.name.setText(person.getName()); holder.age.setText(person.getAge()); return convertView; } class ViewHolder { TextView name; TextView age; } }
使用封装holder
class MyAdapter extends ArrayAdapter<Person>{ public MyAdapter(Context context, int resource, List<Person> objects) { super(context, resource, objects); } @Override public View getView(int position, View convertView, ViewGroup parent) { Person person = getItem(position); CommViewHolder viewHolder = CommViewHolder.get(getContext(), parent, R.layout.item_layout, position,convertView); viewHolder.setTextView(R.id.name, person.getName()).setTextView(R.id.age, person.getAge()); return viewHolder.getmConvertView(); } }
1.2.Adapter类封装
1.原始类
class MyAdapter extends ArrayAdapter<Person> { public MyAdapter(Context context, int resource, List<Person> objects) { super(context, resource, objects); } @Override public View getView(int position, View convertView, ViewGroup parent) { Person person = getItem(position); CommViewHolder viewHolder = CommViewHolder.get(getContext(), parent, R.layout.item_layout, position, convertView); viewHolder.setTextView(R.id.name, person.getName()).setTextView(R.id.age, person.getAge()); return viewHolder.getmConvertView(); } }
2.封装类
public abstract class CommAdapter<T> extends ArrayAdapter<T>{ private int resourceId; public CommAdapter(Context context, int resource, List<T> objects) { super(context, resource, objects); this.resourceId = resource; } @Override public View getView(int position, View convertView, ViewGroup parent) { CommViewHolder viewHolder = CommViewHolder.get(getContext(), parent, resourceId, position, convertView); setConvert(viewHolder, getItem(position)); return viewHolder.getmConvertView(); } public abstract void setConvert(CommViewHolder viewHolder, T t);}
2.ListViewItem不可点击
2.1.原因
抢占焦点控件抢占了焦点:列如button checkbox等
2.2.解决方法
方法一:为抢占焦点的控件布局添加:android:focusable="false";方法二:为整个listview的item布局添加android:descendantFocusability="blocksDescendants"
3.ListView复用导致内容错乱
3.1.checkBox错误选中效果解决
1.未bean对象添加isChecked属性,更具isChecked属性在adapter中动态设置checkBox是否选中2.在adapter中设置一个记录选中checkbox的list集合;
final CheckBox cb = viewHolder.getView(R.id.cb); cb.setChecked(false); if(mPos.contains(viewHolder.getPosition())) { cb.setChecked(true); } cb.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Log.d("guxuewu", "点击了cb"); if(cb.isChecked()) { mPos.add(viewHolder.getPosition()); } else { //希望执行remove object方法,所以进行强转 mPos.remove((Integer) viewHolder.getPosition()); } } });
0 0
- Listview Adapter 优化总结
- Android ListView优化总结
- ListView优化(一) 总结
- listView高级优化总结
- ListView优化总结
- Listview优化总结
- ListView优化总结
- ListView优化总结
- listview优化个人总结
- Android ListView优化总结
- ListView优化总结
- ListView 优化总结
- Listview优化总结
- ListView性能优化总结
- listview 性能优化总结
- ListView原理与优化总结
- 关于ListView的优化总结
- ListView性能优化问题总结
- NOR Flash擦写和原理分析
- JavaScript - 停止计时器
- Linux命令解析:su root和su -root
- Java爬虫,信息抓取的实现
- 我的博客之旅---开端
- ListView优化总结
- 32位centos6.5安装hadoop2.4单机版
- JavaScript - 获取系统当前时间
- OC语法--__unsafe_unretain、__strong、__weak、__autoreleasing的作用
- 从tomcat主页进入管理app
- 配置 ubuntu 13.4 NFS
- Android实战技巧之二十五:模拟器如何重启?试试Genymotion!
- JAVA连接ORACLE数据库(JDBC)(附源码)
- 浩易南:一个小学校长的生意思维