当前位置: 代码迷 >> 综合 >> Iwfu-ListView(一) - ListView使用ViewHolder优化以及ListView的其他
  详细解决方案

Iwfu-ListView(一) - ListView使用ViewHolder优化以及ListView的其他

热度:44   发布时间:2023-12-19 02:13:16.0

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();
  相关解决方案