listview 是Android开发中最熟悉的控件了,经过2年的工作和学习,熟悉和积累了几种优化的方式;
1:在getView中编写带有缓存的代码
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView == null){
convertView = View.inflate(getApplicationContext(), R.layout.list_item, null);
holder = new ViewHolder();
holder.delete = (ImageView) convertView.findViewById(R.id.delete);
holder.tv_msg =(TextView) convertView.findViewById(R.id.tv_list_item);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}
holder.tv_msg.setText(msgList.get(position));
holder.delete.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//删除对应的条目
msgList.remove(position);
//刷新listView
MyListAdapter.this.notifyDataSetChanged();
}
});
convertView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//设置输入框
input.setText(msgList.get(position));
popWin.dismiss();
}
});
return convertView;
}
}
private class ViewHolder{
TextView tv_msg;
ImageView delete;
}
总结:
复用view ,使用ViewHolder
如果item中 含有图片,异步下载图片,可以用线程池等
如果item中含有图片的话,在快速滑动Listview时不用加载图片,等待滑动停止后再加载。
item中的图片使用缓存
考虑是否可以将图片压缩
item的布局文件尽量简单化,比如布局item时用RelativeLayout 等。
可以考虑用RecyclerView 代替listview ,如果熟悉 RecyclerView的话。
常用设置:
1每一个Item之间都会有系统自带的分割线
去除也很简单,只需将分割线的高度设为0,即不可见。appListView.setDividerHeight(0);
listviewQuot.setDividerHeight(0);
listviewQuot.setDivider(null);
android:cacheColorHint="#000000"
2 //设置拖动不变色
listview.setCacheColorHint(0);
//ListView划动至顶部或者底部时,去掉默认的阴影显示
listView.setVerticalFadingEdgeEnabled(false);
3 点击默认背景修改:
给条目设置一个背景 ,如果不设置 则有默认背景
4代码 部分
list.setItemsCanFocus(false);
XML 部分
android:focusable=”false”
android:focusableInTouchMode=”false”
说明:如果一个 ListView 的条目子视图中包含了 CheckBox、ImagaButton 等可以接收触控监听的控件的话,它们可能会遮断 ListView 本身对条目点击的监听,使得其setOnItemClickListener() 方法失效。解决方法为,如果是在代码中动态生成的空间,可以用 setItemsCanFocus() 方法来禁用那些控件获取焦点。如果实在 XML 文件中定义的控件,则应该在 XML 文件添加相应元素属性以增加禁止获取焦点的。
5
另外:多组显示item
使用ListView分类的时候会用到两个方法getItemViewType和getViewTypeCount:
getViewTypeCount这个方法告诉ListView我共有多少种item。
getItemViewType方法告诉ListView每行该显示哪种item。
并且该方法中返回的type类型必须为整数且不能大于getViewTypeCount返回的数。
class MyAdapter extends BaseAdapter{.......
@Override public int getViewTypeCount() { return super.getViewTypeCount(); } @Override public int getItemViewType(int position) { return super.getItemViewType(position); }.......
}