【发布时间】:2014-09-16 02:56:22
【问题描述】:
我正在实现 ExpandableListAdapter,我想知道 ListView 的 CursorAdapter 中是否有任何等效于 bindView 的东西?这样,我可以最大限度地减少对膨胀视图的调用,并且仅在列表滚动时将数据加载到视图中。
以下是我当前的代码亮点:
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;
}
【问题讨论】:
标签: android data-binding expandablelistview expandablelistadapter