android点击事件封装,安卓开发之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的简单封装(三)(多条目的实现)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值