ListView使用ViewHolder优化:
使用ViewHolde帮助ListView缓存,具体原理:
ViewHolder只是将需要缓存的那些view封装好,convertView的setTag才是将这些缓存起来供下次调用
当你的listview里布局多样化的时候 viewholder的作用就有比较明显的体现了。 当然了,单一模式的布局一样有性能优化的作用 只是不直观。 假如你2种模式的布局 当发生回收的时候 你会用setTag分别记录是哪两种 这两种模式会被封装到viewholder中进行保存方便你下次使用。 VH就是个静态类 与缓存无关的
class MyAdapter extends BaseAdapter {
@Override
public int getCount() {
return data.size();
}
@Override
public Object getItem(int position) {
return data.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = LayoutInflater.from(MainActivity.this).inflate(
R.layout.better_listview_item, parent, false);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.tv = (TextView) convertView
.findViewById(R.id.listView_item_tv);
viewHolder.tv.setText(data.get(position));
return convertView;
}
static class ViewHolder {
TextView tv;
}
}
自定义ListView:
自定义一个BetterListView控件继承自ListView,实现ListView数据为空时的显示样式,实现当ListView滑动到边界可以继续滑动一点距离。
/**
* Created by Chan on 2016/5/17.
*
* 自定义的优化的ListView,其中包括:
*
* 1当ListView为空,可以设置自定义显示样式
*
* 2使ListView富有弹性,当滑动到边界会多滑动一点距离
*/
public class BetterListView extends ListView {
private int mMaxOverDistance = 100; // 自定义listView的最大可滑动距离
public BetterListView(Context context) {
super(context);
initMaxOverDistance(context);
}
public BetterListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
/**
* 设置betterListView列表数据为空的显示视图
* 这个方法只能设置和listview在同一个布局下的view/viewGroup
* 1先设置emptyView的visible属性为gone,如果是viewGroup其内部的子控件不能为gone,否则显示时也为不可见
* 2再设置setEmptyView(findViewById(R.id.my_emptyIv)
* 当listView为空会自动加载这个view
*
* @param viewId 同一布局下的view的ID
*/
public void setCustomEmptyView(int viewId) {
View v = ((View)getParent ()).findViewById (viewId);
//其实内部就是调用了listView的setEmptyView方法
this.setEmptyView (v);
}
/**
* 初始化listView的最大可滑动距离
*
* @param context
*/
private void initMaxOverDistance(Context context) {
DisplayMetrics displayMetrics = context.getResources()
.getDisplayMetrics();
float density = displayMetrics.density;
mMaxOverDistance = (int) (density * mMaxOverDistance);
}
@Override
// 控制listview滑动到边缘的处理方法
protected boolean overScrollBy(int deltaX, int deltaY, int scrollX,
int scrollY, int scrollRangeX, int scrollRangeY,
int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {
return super.overScrollBy(deltaX, deltaY, scrollX, scrollY,
scrollRangeX, scrollRangeY, maxOverScrollX, mMaxOverDistance,
isTouchEvent);
}
}
其他
1.设置ListView滑动到边界继续滑动会出现半月形,设置overScrollMode属性可以取消回弹
android:overScrollMode="never"
2.listSelector设置为透明:取消listView的点击效果
android:listSelector="@android:color/transparent"
3.divider设置为@null:设置无item间隔线,也可以设置颜色
android:divider="@null"
android:divider="#ffffff"
4.scrollbars设置为none:设置无滚动条
android:scrollbars="none"
5.瞬间移动到ListView的某一项
betterListView.setSelection (10);
6.往listView动态添加数据再通知listView更新(往数据集合里add一条新的数据后,调用notifyDataSetChanged()),要保证数据集合和listview使用的数据集合是同一个.
data.add("一条新数据");
adapter.notifyDataSetChanged();