Skip to content

内部元素添加点击事件

DONG edited this page Oct 24, 2019 · 2 revisions

元素内部添加点击事件步骤:

  1. Provider 内部定义监听接口.
  2. Provider 内部 onBind 方法中通过 holder.setClick 绑定有点击事件的元素.
  3. Provider 内部覆写 onClick 方法. 在其中添加点击逻辑.
  4. Activity/Fragment 实现监听接口, 并通过 Adapter 传入对应 Provider.

以 Demo 当中复杂页面的按钮组 Section 为例子 - ButtonGroupProvider:

public class ButtonGroupProvider extends BaseItemProvider {
    
    // Provider 内部定义点击事件的接口.
    // 让外部的 Activity/Fragment 去实现
    public interface OnButtonGroupClickListener {
        void onAddClick();    // 点击添加
        void onRemoveClick(); // 点击移除
        void onChangeClick(); // 点击更改
    }

    private OnButtonGroupClickListener mListener;

    public ButtonGroupProvider(Context context) {
        super(context);
    }

    @Override
    public int getLayout() {
        return R.layout.item_complex_button_group;
    }

    @Override
    public void onBind(BaseViewHolder holder, IndexPath indexPath) {
        // 将有点击事件的元素添加到 holder 中
        holder.setClick(R.id.btn_add, this, indexPath); 
        holder.setClick(R.id.btn_remove, this, indexPath);
        holder.setClick(R.id.btn_change, this, indexPath);
    }

    // 覆写 onClick 方法. 此方法中定义所有点击事件.
    @Override
    public void onClick(BaseViewHolder holder, IndexPath indexPath, int viewId) {
        switch (viewId) {
            case R.id.btn_add:
                if (mListener != null) mListener.onAddClick();
                break;
            case R.id.btn_remove:
                if (mListener != null) mListener.onRemoveClick();
                break;
            case R.id.btn_change:
                if (mListener != null) mListener.onChangeClick();
                break;
        }
    }
    
    // 暴露给 Adapter 传入由 Activity/Fragment 实现的点击事件监听器
    public void setListener(OnButtonGroupClickListener listener) {
        this.mListener = listener;
    }
}

在 Adapter 传入由 Activity/Fragment 实现的点击事件监听器. 有 2 种方式:

public class DemoAdapter extends BaseAdapter {

    private ButtonGroupProvider mButtonGroupProvider;

    public ComplexAdapter(Context context) {
        super(context);

        mButtonGroupProvider = new ButtonGroupProvider(context);
        
        // 方式 1
        mButtonGroupProvider.setListener((ButtonGroupProvider.OnButtonGroupClickListener) context);
       
        finishInitialize();
    }

    // 方式 2. 额外实现一个公共 set 方法传递监听
    public void setButtonGroupProviderListener(ButtonGroupProvider.OnButtonGroupClickListener listener) {
         mButtonGroupProvider.setListener(listener);
    }

    // 其它省略代码
}
Clone this wiki locally