我正在实现ExpandableListAdapter,我想知道是否有类似于CursorAdapter中的bindView的ListView?通过这种方式,我可以最小化调用膨胀视图的请求,并且只在列表滚动时将数据加载到视图中。
以下是我目前的代码重点:
public class ContactNumberListAdapter extends BaseExpandableListAdapter {
private Context mContext;
private LayoutInflater mInflater;
private final List<PhoneNumberData> mGroups;
public ContactNumberListAdapter(Context context, List<PhoneNumberData> groups, SingleContactDelegate delegate) {
mContext = context;
mInflater = LayoutInflater.from(context);
mGroups = groups;
}
@Override
public Object getGroup(int groupPosition) {
return mGroups.get(groupPosition);
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
CollapsedViewHolder viewHolder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.single_contact_item_collapsed_layout, null);
viewHolder = new CollapsedViewHolder();
viewHolder.typeView = (TextView) convertView.findViewById(R.id.contact_item_type_collapsed);
viewHolder.numberView = (TextView) convertView.findViewById(R.id.contact_item_number_collapsed);
viewHolder.dropdownButton = (ImageView) convertView.findViewById(R.id.contact_item_button_collapsed);
convertView.setTag(viewHolder);
} else {
viewHolder = (CollapsedViewHolder) convertView.getTag();
}
// ---------- As you can see from this block -------------------
// I load the data and assign it to view after loading the view - all in one place
// ---------- Better implementation wanted ---------------------
PhoneNumberData data = (PhoneNumberData) getGroup(groupPosition);
viewHolder.typeView.setText(data.getPhoneType());
viewHolder.numberView.setText(data.getPhoneNumber());
viewHolder.dropdownButton.setPressed(isExpanded);
return convertView;
}
@Override
public View getChildView(int groupPosition, final int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
final ExpandedViewHolder viewHolder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.single_contact_item_expanded_layout, null);
viewHolder = new ExpandedViewHolder();
viewHolder.callButton = (ImageView) convertView.findViewById(R.id.contact_item_call_button);
viewHolder.favorButton = (ImageView) convertView.findViewById(R.id.contact_item_favorite_button);
convertView.setTag(viewHolder);
} else {
viewHolder = (ExpandedViewHolder) convertView.getTag();
}
final PhoneNumberData data = (PhoneNumberData) getGroup(groupPosition);
if (viewHolder.callButton != null) {
viewHolder.callButton.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
viewHolder.callButton.setPressed(true);
if (mDelegate != null) {
mDelegate.onCallButtonClicked(data.getPhoneNumber());
}
break;
case MotionEvent.ACTION_UP:
viewHolder.callButton.setPressed(false);
break;
default:
break;
}
return true;
}
});
}
if (viewHolder.favorButton != null) {
viewHolder.favorButton.setSelected(data.isFavorite());
viewHolder.favorButton.setOnClickListener(new View.OnClickListener() {
boolean isFavorite = data.isFavorite();
@Override
public void onClick(View v) {
isFavorite = !isFavorite;
viewHolder.favorButton.setSelected(isFavorite);
if (mDelegate != null) {
mDelegate.onFavoriteButtonClicked(data.getPhoneNumber(), isFavorite);
}
}
});
}
return convertView;
}
答案 0 :(得分:0)
/**
* @see android.widget.ListAdapter#getView(int, View, ViewGroup)
*/
public View getView(int position, View convertView, ViewGroup parent) {
if (!mDataValid) {
throw new IllegalStateException("this should only be called when the cursor is valid");
}
if (!mCursor.moveToPosition(position)) {
throw new IllegalStateException("couldn't move cursor to position " + position);
}
View v;
if (convertView == null) {
v = newView(mContext, mCursor, parent);
} else {
v = convertView;
}
bindView(v, mContext, mCursor);
return v;
}
这就是CursorAdapter所做的...你的代码等同于CursorAdapter。 + _ +