我有一个包含许多不同行布局的ListAdapter。为了使代码更清晰,我想将行的布局从适配器的getView()中外包到View类中。是否可以将XML布局填充到自定义视图中?我只找到LayoutInflater,但它返回一个View,这并没有帮助。我想要像Activity的setLayout()那样的东西。这可能吗?
谢谢!
谢谢!
您可以创建自定义行视图,并在其构造函数中填充您的xml:
public MyRow extends LinearLayout {
public MyRow(Context context) {
super(context);
LayoutInflater.from(context).inflate(R.layout.my_row, this, true);
... other initialization ...
}
}
然后在my_row.xml
中使用merge
:
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
... your row layout ...
</merge>
merge
元素会将其子元素添加为您自定义视图的子元素。有关更多信息,请查看合并布局。
我总是使用一个带有viewholder的自定义适配器,例如:
public class CalendarAdapter extends BaseAdapter {
protected static CalViewHolder holder;
private LayoutInflater mInflater;
public HashMap<Integer,String[]> appointments = new HashMap<Integer,String[]>();
public CalendarAdapter(Context context,HashMap<Integer,String[]> set_appointments) {
// Cache the LayoutInf
mInflater = LayoutInflater.from(context);
appointments = set_appointments;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return appointments == null ? 0:appointments.size();
}
@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 position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.xml.appointment, null);
holder = new CalViewHolder();
holder.app_lay = (LinearLayout) convertView.findViewById(R.id.appointment_layout);
holder.app_head = (TextView) convertView.findViewById(R.id.appointment_head);
holder.app_body = (TextView) convertView.findViewById(R.id.appointment_body);
convertView.setTag(holder);
}else{
holder = (CalViewHolder) convertView.getTag();
}
holder.app_head.setText(appointments.get(position)[0]);
holder.app_body.setText(appointments.get(position)[1]);
return convertView;
}
static class CalViewHolder {
LinearLayout app_lay;
TextView app_head;
TextView app_body;
}
}