ExpandView等效于ExpandableListAdapter

时间:2014-09-16 02:56:22

标签: android data-binding expandablelistview expandablelistadapter

我正在实现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;
    }

1 个答案:

答案 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。 + _ +