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

来源:互联网 发布:mac注音输入法 简体字 编辑:程序博客网 时间:2024/06/05 17:38

为了使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还是一个相对复杂的组件,理解它的重用原理会让我们更好的使用它。等我很清晰它重用的原理时,会更一篇文章介绍。




0 0
原创粉丝点击