安卓开发之recyclerview的BaseAdapter的简单封装(二)(优化篇之条目子view的点击事件)

由于之前写的 安卓框架搭建(七)BaseAdapter的封装中条目的子view的点击事件不是那么直观 , 如果点击事件多的话会写很多个监听,这里将条目的子view的点击事件进行了优化

并且将YcCommonBaseAdapter与YcBaseAdapter进行合并

首先将YcCommonBaseAdapter中的 点击事件的监听移至YcBaseAdapter

   private OnItemClickListener mItemClickListener;
    private OnItemChildClickListener mOnItemChildClickListeners;

并设置他的 set  和 get 方法

/**
     * 设置条目点击监听
     *
     * @param itemClickListener
     */
    public void setOnItemClickListener(OnItemClickListener itemClickListener) {
        mItemClickListener = itemClickListener;
    }

    /**
     * @return 获取条目点击监听
     */
    public final OnItemClickListener getOnItemClickListener() {
        return mItemClickListener;
    }

    /**
     * 设置条目中子view的点击监听
     *
     * @param listener
     */
    public void setOnItemChildClickListener(OnItemChildClickListener listener) {
        mOnItemChildClickListeners = listener;
    }

    /**
     * 获取条目中子view的点击监听
     */
    @Nullable
    public final OnItemChildClickListener getOnItemChildClickListener() {
        return mOnItemChildClickListeners;
    }

在onCreateViewHolder 中有稍稍的改动

@Override
    public YcBaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (mContext == null) {
            mContext = parent.getContext();
        }
        YcBaseViewHolder viewHolder = null;
        switch (viewType) {
            case TYPE_NORMAL_HEADER_VIEW:
                if (mNormalHeaderLayout == null && mContext != null) {
                    mNormalHeaderLayout = new LinearLayout(mContext);
                }
                viewHolder = YcBaseViewHolder.create(mNormalHeaderLayout);
                break;

            case TYPE_NORMAL_FOOTER_VIEW:
                if (mNormalFooterLayout == null && mContext != null) {
                    mNormalFooterLayout = new LinearLayout(mContext);
                }
                viewHolder = YcBaseViewHolder.create(mNormalFooterLayout);
                break;
            case TYPE_FOOTER_VIEW:
                if (mLoadMoreFooterLayout == null && mContext != null) {
                    mLoadMoreFooterLayout = new RelativeLayout(mContext);
                }
                viewHolder = YcBaseViewHolder.create(mLoadMoreFooterLayout);
                break;
            case TYPE_EMPTY_VIEW:

                if (mEmptyLayout == null && mContext != null) {
                    mEmptyLayout = new FrameLayout(mContext);
                }
                viewHolder = YcBaseViewHolder.create(mEmptyLayout);
                break;

            case TYPE_RELOAD_VIEW:
                viewHolder = YcBaseViewHolder.create(mReloadView);
                break;
            default:
                //正常布局
                viewHolder = YcBaseViewHolder.create(mContext, getItemLayoutId(), parent);
        }
//在创建view的时候 将当前适配器传递给viewholder
        viewHolder.setAdapter(this);
        return viewHolder;

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        int viewType = holder.getItemViewType();
        if (isCommonItemView(viewType)) {
            position = position - getNormalHeaderLayoutCount();
            if (getItem(position) != null) {
                bindCommonItem(holder, position);
            }
        }
    }

绑定view的方法


    private void bindCommonItem(RecyclerView.ViewHolder holder, final int position) {
        final YcBaseViewHolder viewHolder = (YcBaseViewHolder) holder;

        convert(viewHolder, getAllData().get(position), position);

        viewHolder.getConvertView().setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (getOnItemClickListener() != null) {
                    mItemClickListener.onItemClick(viewHolder, getAllData().get(position), position);
                }
            }
        });
    }

    @Nullable
    public T getItem(@IntRange(from = 0) int position) {
        if ((position >= 0 && position < getAllData().size()))
            return getAllData().get(position);
        else
            return null;
    }
  //子类必须实现将数据传递给父类onBindViewHolder
    protected abstract void convert(YcBaseViewHolder holder, T data, int position);

    //获取子类的布局
    protected abstract int getItemLayoutId();

在使用的时候 如果想要条目中的子view添加点击事件直接在适配器中完成即可


/**
 * 加载更多适配器
 */
public class RefreshAdapter extends YcBaseAdapter {
    @Override
    protected int getItemLayoutId() {
        return R.layout.item_layout;
    }


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

    @Override
    protected void convert(YcBaseViewHolder holder, final String data, int position) {
        holder.setText(R.id.item_title, data);
        holder.addOnClickListener(R.id.item_title);
        holder.addOnClickListener(R.id.item_btn);

    }


}

在页面中只需要根据不同的id  区分不同的子view的点击事件

   //添加子view的点击事件
        adapter.setOnItemChildClickListener(new OnItemChildClickListener() {
            @Override
            public void onItemChildClick(YcBaseAdapter adapter, View view, int position) {
                switch (view.getId()) {
                    case R.id.item_btn:
                        Object o = adapter.getAllData().get(position);
                        Toast.makeText(OneItemActivity.this, "当前条目 :" + position + "----" + "条目数据 :" + o.toString(), Toast.LENGTH_SHORT).show();
                        break;

                    case R.id.item_title:
                        Toast.makeText(OneItemActivity.this, "当前条目 :" + position + "----" + "这是title", Toast.LENGTH_SHORT).show();
                        break;


                }

            }
        });

这样代码看起来就很简洁

以上就是,安卓开发之recyclerview的BaseAdapter的简单封装(二)(优化篇之条目子view的点击事件),的全部内容

如有不了解的 可以去github下载源码 

github源码地址

如果想了解本章节内容可直接查看 分支3

或 加入安卓开发交流群:安卓帮595856941

相关链接:

下一篇:

安卓开发之recyclerview的BaseAdapter的简单封装(三)(多条目的实现)

 

你可能感兴趣的:(安卓必备知识,工具类相关,github开源库,安卓架构)