使用BaseAdaper时,我们常写一个类来继承它。因为BaseAdapter是一个抽象类,所以继承它必修实现它的方法。下面用一个小例子来学习BaseAdapter适配器实现ListView的多行显示效果。
例子的目录结构:
com.person.adapter包:
public class MyAdapter extends BaseAdapter {
LayoutInflater mInflater;
List<PersonInfo> list;
public MyAdapter(Context context, List<PersonInfo> list) {
super();
this.mInflater = LayoutInflater.from(context);
this.list = list;
}
// 内部类优化作用
public final class ViewHolder {
public TextView id;
public TextView name;
public TextView address;
public ImageView img;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = mInflater.inflate(R.layout.list_item, null);
viewHolder.id = (TextView) convertView.findViewById(R.id.tv_id);
viewHolder.name = (TextView) convertView.findViewById(R.id.tv_name);
viewHolder.address = (TextView) convertView
.findViewById(R.id.tv_address);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.id.setText(list.get(position).getId());
viewHolder.name.setText(list.get(position).getName());
viewHolder.address.setText(list.get(position).getAddress());
return convertView;
}
}
com.person.activity包:
public class MianActivity extends Activity {
private ListView listView;
private MyAdapter adapter;
List<PersonInfo> list = new ArrayList<PersonInfo>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
listView = (ListView) findViewById(R.id.lv);
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
XMLReader reader = factory.newSAXParser().getXMLReader();
XMLParse xmlParse = new XMLParse(list);
reader.setContentHandler(xmlParse);
InputStream is = getResources().openRawResource(R.raw.person);
reader.parse(new InputSource(is));
// 测试
for (Iterator iterator = list.iterator(); iterator.hasNext();) {
PersonInfo personInfo = (PersonInfo) iterator.next();
System.out.println(personInfo.getId());
System.out.println(personInfo.getName());
System.out.println(personInfo.getAddress());
}
} catch (Exception e) {
e.printStackTrace();
}
adapter = new MyAdapter(this, list);
listView.setAdapter(adapter);
}
}
com.person.model包:
public class PersonInfo {
private String id;
private String name;
private String address;
public PersonInfo(){
super();
}
public void setId(String id){
this.id = id;
}
public String getId(){
return id;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setAddress(String address){
this.address = address;
}
public String getAddress(){
return address;
}
}
com.person.parse包:public class XMLParse extends DefaultHandler {
private String tag;
List<PersonInfo> list;;
PersonInfo personInfo;
// 构造方法实例化list
public XMLParse(List<PersonInfo> list) {
super();
this.list = list;
}
@Override
public void startDocument() throws SAXException {
super.startDocument();
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if (localName.equals("person")) {
personInfo = new PersonInfo();
}
tag = localName;
super.startElement(uri, localName, qName, attributes);
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
String str = new String(ch, start, length);
if (tag.equals("id")) {
personInfo.setId(str);
} else if (tag.equals("name")) {
personInfo.setName(str);
} else if (tag.equals("address")) {
personInfo.setAddress(str);
}
super.characters(ch, start, length);
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// 此处是pName而不再是localName
if (qName.equals("person")) {
list.add(personInfo);
}
tag = "";
super.endElement(uri, localName, qName);
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
}
效果图: