Android ListView之视图显示优化和注意事项

本文介绍如何通过自定义Adapter优化Android ListView的性能,特别是处理大量数据时避免内存溢出的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为了使Listview展现丰富的显示样式,可以自定义一个继承BaseAdapter的类。

public class CustomAdapter extends BaseAdapter {
    //一般都需要用到上下文
    private Context ctx;
    //ListView将要展示的数据集合
    private List<String> demos;

    public CustomAdapter(Context ctx, List<String> demos) {
        this.ctx = ctx;
        this.demos = demos;
    }

    @Override
    public int getCount() {
        //返回数据的总个数
        return demos.size();
    }

    @Override
    public Object getItem(int position) {
        //返回某一个具体数据
        return demos.get(position);
    }

    @Override
    public long getItemId(int position) {
        //返回索引
        return position;
    }

    //返回ListView每项要展示的View视图样式
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        return new DemoView(ctx, demos.get(position));
    }

    //为了看得直观我将样式类也写在这个文件中
    /*这是一个简单的view类,用于定义listview每项样式,也可以定义的很复杂*/
    public class DemoView extends LinearLayout {

        public DemoView(Context context, String data) {
            super(context);
            //这里只是简单的将数据显示在TextView上,完全可以定义复杂的样式
            TextView tv = new TextView(context);
            tv.setText(data);
            addView(tv);
        }
    }
}
上面的代码一般情况下是能够将数据很好的展现出来,并且可以自定义显示样式。不过,当数据十分之大时CustomAdapter的getView方法需要十分之多次new DemoView对象,这将给手机带来很大的负担,甚至导致out of memory,程序崩溃。为了避免这种情况,聪明的Android系统设计师早就将解决方案设计在了Listview之中。

Listview在我刚接触的时候给我带来的是崩溃的感觉,因为它被设计的是能够重用每个item的样式。这涉及的比较深层次些,待我研究透彻之后再分析说明。当数据量十分之大时,可以将上面的类这样优化

public class CustomAdapter extends BaseAdapter {
    //一般都需要用到上下文
    private Context ctx;
    //ListView将要展示的数据集合
    private List<String> demos;

    public CustomAdapter(Context ctx, List<String> demos) {
        this.ctx = ctx;
        this.demos = demos;
    }

    @Override
    public int getCount() {
        //返回数据的总个数
        return demos.size();
    }

    @Override
    public Object getItem(int position) {
        //返回某一个具体数据
        return demos.get(position);
    }

    @Override
    public long getItemId(int position) {
        //返回索引
        return position;
    }

    //返回ListView每项要展示的View视图样式
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        if (convertView == null) {
            //当要显示的view对象为null时,创建view对象
            convertView = new DemoView(ctx);
        }
        //不管是重用的view还是新创建的view都需要更新下一个数据内容
        ((DemoView) convertView).showData(demos.get(position));
        //返回所显示的view
        return convertView;
    }

    //为了看得直观我将样式类也写在这个文件中
    /*这是一个简单的view类,用于定义listview每项样式,也可以定义的很复杂*/
    public class DemoView extends LinearLayout {
        private Context context;

        public DemoView(Context context) {
            //初始化一些必要的变量
            super(context);
            this.context = context;
        }

        //构造视图,更新数据。
        void showData(String data) {
            //将之前的显示数据清除,否则之前的数据和现在的数据会混乱显示
            removeAllViews();
            //这里只是简单的将数据显示在TextView上,完全可以定义复杂的样式
            TextView tv = new TextView(context);
            tv.setText(data);
            addView(tv);
        }
    }
}
经过之上更改后,会很大成都的降低系统的消耗。DemoView中是通过new来创建组件的,完全可以通过定义xml样式来定义组件。

Listview值得注意的地方是要通过更改数据模型来改变组件的属性,不能直接对组件的属性直接设置,因为它是重用的,当直接设置组件的属性时,重用这个组件的其他数据也会显示这些属性。会出现错乱的显示效果。

总之,Listview还是一个相对复杂的组件,理解它的重用原理会让我们更好的使用它。等我很清晰它重用的原理时,会更一篇文章介绍。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值