在扩展ArrayAdapter的CustomAdapter中,如果不调用getView()方法,可以尝试重写getViewTypeCount()和getItemViewType()方法,并使用ViewHolder模式来优化性能。
下面是一个示例代码:
public class CustomAdapter extends ArrayAdapter {
private static final int VIEW_TYPE_DEFAULT = 0;
private static final int VIEW_TYPE_SPECIAL = 1;
public CustomAdapter(Context context, List data) {
super(context, 0, data);
}
@Override
public int getViewTypeCount() {
// 返回视图类型的数量(这里我们只有两种类型:默认和特殊)
return 2;
}
@Override
public int getItemViewType(int position) {
// 根据位置返回视图类型
if (position % 2 == 0) {
return VIEW_TYPE_SPECIAL;
}
return VIEW_TYPE_DEFAULT;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
int viewType = getItemViewType(position);
if (convertView == null) {
viewHolder = new ViewHolder();
switch (viewType) {
case VIEW_TYPE_DEFAULT:
convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_default, parent, false);
// 初始化默认视图中的控件
viewHolder.textView = convertView.findViewById(R.id.default_textView);
break;
case VIEW_TYPE_SPECIAL:
convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_special, parent, false);
// 初始化特殊视图中的控件
viewHolder.textView = convertView.findViewById(R.id.special_textView);
break;
}
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
// 更新视图中的数据
String item = getItem(position);
viewHolder.textView.setText(item);
return convertView;
}
private static class ViewHolder {
TextView textView;
}
}
在上面的示例中,我们重写了getViewTypeCount()方法,返回视图类型的数量。在getItemViewType()方法中,根据位置判断返回的视图类型是默认视图还是特殊视图。
在getView()方法中,我们使用了ViewHolder模式来优化性能。当convertView为空时,根据视图类型使用不同的布局文件进行加载,并初始化ViewHolder对象。然后将ViewHolder对象存储在convertView的tag中,以便复用。最后更新视图中的数据。
通过以上方法,可以实现Android CustomAdapter扩展ArrayAdapter不调用getView()方法,并且能够正确地显示不同类型的视图。
上一篇:Android CTS无法运行