列表的显示需要三个元素:
1.ListVeiw 用来展示列表的View。
2.适配器 用来把数据映射到ListView上的中介。
3.数据 具体的将被映射的字符串,图片,或者基本组件。
destination: 制作listview
question1:为什么要适配器?
answer1:ListView是一连串的“条子”,但是在布局的时候无法确定要布局几个条子,所以只写一个ListView。之后用适配器让每个数据都对应一个条子出来。
根据列表的适配器类型,列表分为三种,ArrayAdapter,SimpleAdapter和SimpleCursorAdapter
其中以ArrayAdapter最为简单,只能展示一行字。SimpleAdapter有最好的扩充性,可以自定义出各种效果。SimpleCursorAdapter可以认为
是SimpleAdapter对数据库的简单结合,可以方面的把数据库的内容以列表的形式展示出来。
数据库还没看先不管SimpleCursorAdapter,ArrayAdapter比较弱,也不说了,下面只说SimpleAdapter.
分成三步走:
第一步:造数据
这个怎么个造法根据需求来,最后存入一个像ArrayList
第二步:适配器上场
SimpleAdapter mSchedule = new SimpleAdapter(context, //activity的context
getlist(intinum),//数据来源 ,第一步造出来的数据
R.layout.my_listitem,//ListItem的XML实现,对应一下布局
new String[] {"ItemTitle", "ItemText"},//动态数组与ListItem对应的子项
new int[] {R.id.linearText1,R.id.linearText2});//ListItem的XML文件里面的两个TextView ID
这样理解:从数据里找到String[]的一个对应项,得到真正要显示的数据,
显示在哪里呢?显示在new int[]的那两个地方。
显示在哪个ListView里呢?去R.layout.XX那里去找。
最后放在context对应的activity里。
第三步
//添加并且显示
list.setAdapter(mSchedule);
讲完了,周末大放送,学长说BaseAdapter也很好用,我还不清楚它和前几个的关系。用起来有个不同。
-----------
今天看博文,好像和其他Adapter也是一个并列的关系 ——140718更新
-----------
三步走
第一步:找个类继承BaseAdapter 和 造数据(这个不用说和上面一样)
成了这个样子
class a extends BaseAdapter{
@Override
public int getCount() {
// TODO Auto-generated method stub
return 0;
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int arg0, View arg1, ViewGroup arg2) {
// TODO Auto-generated method stub
return null;
}
}
其中我们主要要写
getCount()和
getView这两个方法。
getCount得到数据数目。getView得到每一“条”的样子
第二步:适配器上场
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater mInflater = LayoutInflater.from(context);
ViewHolder holder = null;//这里是一窝蜂绑定
if (convertView == null) {
holder=new ViewHolder();
convertView = mInflater.inflate(R.layout.vlist2, null);
holder.img = (ImageView)convertView.findViewById(R.id.img);
holder.title = (TextView)convertView.findViewById(R.id.title);
holder.info = (TextView)convertView.findViewById(R.id.info);
holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn);
convertView.setTag(holder);
}else {
holder = (ViewHolder)convertView.getTag();
}
//这里是把数据送到绑定好的地方
holder.img.setBackgroundResource((Integer)mData.get(position).get("img"));
holder.title.setText((String)mData.get(position).get("title"));
holder.info.setText((String)mData.get(position).get("info"));
holder.viewBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showInfo();
}
});
return convertView;//大功告成,得到一条,他就是这样一条一条绘制出来的
}
class ViewHolder {
ImageView img_ObjImg;
TextView txtVw_ObjName;
TextView txtVw_ObjNameContent;
TextView txtVw_ObjDescribe;
}
}
第三步:添加并且显示
list.setAdapter(mSchedule);在“主”类中写MyAdapter adapter = new MyAdapter(context);
setListAdapter(adapter);
一瞬间adapter把所有事情都搞定了。
列表项的一个例子
下面是一些关于ListView的tip:
1.如果要曾加或减少条子的数量,直接改数据就好了,然后adapter.notifydatasetchanged(),就自动重新绘制更新。
2.ListView也可以设置监听,类似微信聊天的整个条子的监听。 参阅 这个函数:onItemClick()