ListView使用ViewHolder优化:
使用ViewHolde帮助ListView缓存,具体原理:
http://blog.csdn.net/guolin_blog/article/details/44996879
ViewHolder只是将需要缓存的那些view封装好,convertView的setTag才是将这些缓存起来供下次调用
当你的listview里布局多样化的时候 viewholder的作用就有比较明显的体现了。 当然了,单一模式的布局一样有性能优化的作用 只是不直观。 假如你2种模式的布局 当发生回收的时候 你会用setTag分别记录是哪两种 这两种模式会被封装到viewholder中进行保存方便你下次使用。 VH就是个静态类 与缓存无关的
class MyAdapter extends BaseAdapter {
@Overridepublic int getCount() {return data.size();}@Overridepublic Object getItem(int position) {return data.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic 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();