【问题标题】:bindView equivalent for ExpandableListAdapter等效于 ExpandableListAdapter 的 bindView
【发布时间】: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


    【解决方案1】:
        /**
     * @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。 +_+

    【讨论】:

      猜你喜欢
      • 2015-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-29
      • 2021-09-22
      • 1970-01-01
      • 2012-02-18
      • 2017-06-20
      相关资源
      最近更新 更多