由于之前写的 安卓框架搭建(七)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的简单封装(三)(多条目的实现)