BB:虽然这个出来很久了,但是很惭愧还没有在真正的项目中使用到。不过话说过来android N都出来了,大部分android手机系统还是4.x,在此只能呵呵。顺便说一句这是我第一篇博客,希望各位看官不喜勿喷,如果是好的意见我欣然接受,好了bb完了。
- recycleview的初步使用
- recycleview.adapter的认识
- 打造通用recycleview adapter(暂时不加)
引入 recycleview
首先我们要gradle的依赖库中添加 compile ‘com.android.support:recyclerview-v7:21.+’ 。如果是eclipse直接导入android-support-v7-recyclerview.jar就可以了。
recycleview初步使用
基本上就是这四个步骤
/**
* 设置Adapter
*/
mRecyclerView.setAdapter(mListAdapter);
/**
* 设置布局管理器
*/
mRecyclerView.setLayoutManager(linearLayoutManager);
/**
* 设置item分割线
*/
mRecyclerView.addItemDecoration(itemDecoration);
/**
* 设置item动画
*/
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
android为我们提供了3种LayoutManager
LinearLayoutManager:线性布局,横向或者纵向滑动列表
GridLayoutManager:表格布局
StaggeredGridLayoutManager:流式布局,例如瀑布流效果
还可以继承RecyclerView.LayoutManager来实现一个自定义的LayoutManager。
我们当然也可以通过RecyclerView.ItemAnimator类定制动画,然后通过RecyclerView.setItemAnimator()方法来进行使用。
recycleview adapter的使用
其实recycleview的adapter其实也和我们平常的adapter也差不多,在我看来最大的不同就是它封装了一个viewholder。接下来描述下一下简单的recycleview adapter 要如何写吧。
* 编写一个adapter继承RecyclerView.Adapter
public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ItemViewHolder>{
private Context mContext;
private List<String> mDatas = null;
private LayoutInflater mInflater;
//点击事件接口
private OnItemClickListener mClickListener = null;
/**
* 初始化数据
* @param context
* @param Datas
*/
public ListAdapter(Context context,List<String> Datas) {
mContext = context;
mDatas = mDatas;
mInflater = LayoutInflater.from(context);
}
@Override
public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
ItemViewHolder viewHolder = new ItemViewHolder(mInflater.inflate(R.layout.support_simple_spinner_dropdown_item,null));
return viewHolder;
}
/**
* 绑定数据set data
* @param holder
* @param position
*/
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1)
@Override
public void onBindViewHolder(ItemViewHolder holder, final int position) {
holder.mTextView.setText("");
if(mClickListener != null){
/**
* 这里加了判断,itemViewHolder.itemView.hasOnClickListeners()
* 目的是减少对象的创建,如果已经为view设置了click监听事件,就不用重复设置了
* 不然每次调用onBindViewHolder方法,都会创建两个监听事件对象,增加了内存的开销
*/
if(!holder.itemView.hasOnClickListeners()){
holder.itemView.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
mClickListener.OnItemClick(v,position);
}
});
}
}
}
@Override
public int getItemCount() {
return mDatas.size();
}
/**
* recyvlerView的viewholder
*/
class ItemViewHolder extends RecyclerView.ViewHolder{
private TextView mTextView;
public ItemViewHolder(View itemView) {
super(itemView);
//初始化控件,find id
// mTextView = itemView.findViewById(R.id.)
}
}
interface OnItemClickListener{
public void OnItemClick(View view,int position);
public void OnItemLongClick(View view,int position);
}
}
补充一下:至于分割线和动画等这里我先不做分析。可以参考这里写链接内容
Base RecycleView Adapter
public abstract class BaseAdapter extends RecyclerView.Adapter<BaseViewHolder> {
private OnItemClickListener onItemClickListener;
@Override
public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new BaseViewHolder(LayoutInflater.from(parent.getContext()).inflate(viewType, parent, false));
}
@Override
public void onBindViewHolder(final BaseViewHolder holder, final int position) {
if (onItemClickListener != null) {
holder.getmConvertView().setClickable(true);
holder.getmConvertView().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onItemClickListener.onItemClick(holder.getAdapterPosition());
}
});
}
onBindView(holder, holder.getAdapterPosition());
}
protected abstract void onBindView(BaseViewHolder holder, int position);
@Override
public int getItemViewType(int position) {
return getLayoutID(position);
}
protected abstract int getLayoutID(int position);
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
}