ListView优化问题

        在使用ListView控件的过程中,由于加载条目过多,在滑动时可能会造成卡顿,这是因为ListView在当前屏幕显示多少个条目,就会创建多少个对象,每一个条目都是一个对象。在滑动时,滑出屏幕的条目对象会被销毁,新加载到屏幕的条目会创建新的对象,因此在滑动时会不断地创建对象和销毁对象,并且每一个条目都需要加载一次布局,加载布局不仅对内存消耗比较大,而且浪费时间。如果条目包含图片,图片加载的时间比较长,就会造成内存溢出异常。

        因此,我们在开发时需要对ListView进行优化,目的在于使滑动时不会重复创建对象,减少内存消耗和屏幕渲染处理。

        (1)创建静态类

        创建一个静态类,将需要加载的控件变量放在该类中,这样可以保证所有的控件只创建一次对象,不会重复创建对象。

static class ViewHolder{
    TextView tv_title;
    ImageView iv_img;
    Button btn_detail;
}

        (2)服用缓存视图对象

        在Adapter的getView(int position,View convertView,ViewGroup parent)方法中convertView代表的就是之前滑出屏幕的条目对象。如果滑动ListView,滑动出屏幕的View对象会以缓存的形式存在,而convertView就是缓存的View对象,可以复用缓存该对象减少新对象的创建。在加载布局文件时先判断convertView是否存在,不存在则说明没有缓存的View对象,则使用View.inflate()加载布局,进行布局的初始化,否则复用缓存的View对象。

if(convertView == null){
    convertView = View.inflate(context,R.layout.item,null);
    holder = new ViewHolder();
    holder.tv_title = findViewById(R.id.tv_title)
    ...
    convertView.setTag(holder);
}
else{
    holder = convertView.getTag();
}

注意:getView()方法返回值为View,复用时需将返回值改为convertView

        (3)使用RecycleView替换

        RecycleView是ListView的提升,在内存优化等方面都有很大的优势,但是有些操作可能会比较复杂,如果实现中可以使用RecycleView的话,建议使用RecycleView代替ListView。

猜你喜欢

转载自blog.csdn.net/gengkui9897/article/details/81483822
今日推荐