在android开发过程中,UI经常需要动态加载一个由任意数量的类似的项所构成的列表,因为其项的数量是不定的,而且可能动态改变,因此不能在xml文件中静态设置。而应使用“在xml中放置listView,在java代码中动态加载”的方式实现。
这里是核心,创建一个继承自BaseAdapter的类,一般至少需要定义或重写其五个方法。但是在重写之前,先要在这个类里新加一个数据成员,也就是关于你的每一项的数组,比如说你的一个列表项是由两个TextView构成的。那么这个数组就为
ArrayList
以此类推,有必要的话,写个合适的内部类来指定这个数据的类型。
之后,定义第一个方法构造方法,要求参数一般是Context用于创建Inflater来实例化你的布局文件和一个data的类型来初始化数据,有时,如果有需要对Activity的操作的话,可以把Context换成Activity。构造方法里就进行一些最基本的数组的初始化操作即可。(关于每一项的具体内容初始化,要放到getView()里)。在强调一遍,一般要在这里利用Context初始化一个Inflater成员变量,以便重写后面的getView()方法
接着是重写第二个方法,
getCount()
如果在没有特殊业务需求的情况下一般上述data的size()即可;
然后重写第三个方法,
getItem(int position)
如果在没有特殊业务需求的情况下一般也返回上述data.get(position)即可;
第四个方法
getItemId(int position)
没有为数据定义特别的ID的话,就返回postion就行
重点是最后一个方法的重写
View getView(int position, View convertView, ViewGroup parent)
这个方法就是BaseAdapter用于生成你每一个列表项所要调用的方法。
先简要说明一下参数,position就是当前UI项的下标,用来对应你的data下标;
convertView是一个列表项的视图对象,在第一次调用时为null,后面更更新视图调用时不为null,所以用之前一定要检验其是否为null,不然会报空指针异常;
parent就是这个列表项视图最终归属的父视图
了解完参数的含义后,以每一个列表项为两个TextView为例(id分别假设为text1、text2,data为ArrayList
@Override
public View getView(int position, View convertView, ViewGroup parent){
String[] twoTexts = null;
if(convertView == null){
converView = inflater.inflater(R.layout.item,parent,false);
TextView firstText = (TextView)convertView.findViewById(R.id.text1);
TextView secondText = (TextView)convertView.findViewById(R.id.text1);
//下面是对两个TextView的一些操作,这里取最简单的直接拿data初始化
twoTexts = data.get(postion);
firstText.setText(twoTexts[0]);
secondText.setText(twoTexts[1]);
}
return convertView;
}
最后在你的Activity获取到ListView对象,直接
ArrayList data = new ArrayList<>();
data.add(new String[]{"第一项的text1","第一项的text2"});
data.add(new String[]{"第二项的text1","第二项的text2"});
listView.setAdapter(new YourAdapter(YourActivity.this,data));
大功告成!