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