文章部分代码参考:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1118/2004.html
RecyclerView Adapter相对于ListView Adapter:
1、它将数据、排列方式、数据的展示方式都分割开来
2、它没有ListView、GridView中的setOnItemClickListener方法。
AdapterView拥有OnItemClickListener方法,就像View拥有OnClickListener一样
而RecyclerView并没有OnItemClickListener方法。
public interface OnItemClickListener { void onItemClick(AdapterView<?> var1, View var2, int var3, long var4); }
ListAdapter中的靠getView来获取每个itemView: 初始化view 、初始化Holder、设置Holder数据都在getView中
@Override public View getView(final int position, View convertView, ViewGroup parent) { if (mInfos.size() == 0) { return convertView; } final HolderT holder; if (null == convertView) { convertView = inflateView(); holder = initHolder(convertView); convertView.setTag(holder); } else { holder = (HolderT) convertView.getTag(); } setHolderDatas(position, holder, getItem(position)); return convertView; }
static class ViewHolder { public TextView mTextView; } @Override public ViewHolder initHolder(View view) { final ViewHolder holder; holder = new ViewHolder(); holder.mTextView = (TextView) view.findViewById(R.id.text); return holder; } @Override public void setHolderDatas( int position, ViewHolder holder, TagKeyValue item) { holder.mTextView.setText(item); holder.mTextView.setOnClickListener(this); }
而RecyclerView则将这些分开出处理,将初始化view、初始化holder放在onCreateViewHolder中,
而将设置Holder数据放在onBindViewHolder中
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
public String[] datas = null;
private OnRecyclerViewItemClickListener mOnItemClickListener = null;public MyAdapter(String[] datas,OnRecyclerViewItemClickListener mOnItemClickListener) {
this.datas = datas;
this.mOnItemClickListener= mOnItemClickListener;
}
//定义接口
public static interface OnRecyclerViewItemClickListener {
void onItemClick(View view , DataModel data);
}
//创建新View,被LayoutManager 所调用
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item,viewGroup,false);
ViewHolder vh = new ViewHolder(view);
//将创建的View注册点击事件,这部分也可以放到onBindViewHolder中(感觉更好),如下面紫色背景文字
view.setOnClickListener(this);
return vh;
}
//将数据与界面进行绑定的操作
@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {
viewHolder.mTextView.setText(datas[position]);
//将数据保存在itemView的Tag中,以便点击时进行获取
viewHolder.itemView.setTag(datas.get(position));
//viewHolder.itemView注册点击事件,只有RecyclerView.ViewHolder才有itemview
viewHolder.itemView.setOnClickListener(this);
}
//获取数据的数量
@Override
public int getItemCount() {
return datas.length;
}
@Override
public void onClick(View v) {
if (mOnItemClickListener != null) {
//注意这里使用getTag方法获取数据
mOnItemClickListener.onItemClick( v, (DataModel)v.getTag() );
}
}
//自定义的ViewHolder,持有每个Item的的所有界面元素
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView mTextView;
public ViewHolder(View view){
super(view);
mTextView = (TextView) view.findViewById(R.id.text);
}
}
}