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

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 {
        @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();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值