#主要API
LayoutManager:布局管理器(LinearLayoutManager 、GridLayoutManager、StaggeredGridLayoutManager)
ItemDecoration:绘制Item间的间隔
ItemAnimator:Item增删的动画
#使用步骤
1.build.gradle中添加
compile'com.android.support:recyclerview-v7:23.1.1'
2.布局内添加
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
></android.support.v7.widget.RecyclerView>
3.代码中初始化并设置
RecyclerView recycleView = findView(R.id.recyclerview);
设置布局管理器
LinearLayoutManager linearLayoutManager=new LinearLayoutManager(this);//线性
GridLayoutManager gridLayoutManager=new GridLayoutManager(this,4);//网格
StaggeredGridLayoutManager staggeredGridLayoutManager=new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL);//流式
设置布局管理器的方向
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
设置
recyclerView.setLayoutManager(layout);
LayoutManager:布局管理器(LinearLayoutManager 、GridLayoutManager、StaggeredGridLayoutManager)
ItemDecoration:绘制Item间的间隔
ItemAnimator:Item增删的动画
#使用步骤
1.build.gradle中添加
compile'com.android.support:recyclerview-v7:23.1.1'
2.布局内添加
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
></android.support.v7.widget.RecyclerView>
3.代码中初始化并设置
RecyclerView recycleView = findView(R.id.recyclerview);
设置布局管理器
LinearLayoutManager linearLayoutManager=new LinearLayoutManager(this);//线性
GridLayoutManager gridLayoutManager=new GridLayoutManager(this,4);//网格
StaggeredGridLayoutManager staggeredGridLayoutManager=new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL);//流式
设置布局管理器的方向
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
设置
recyclerView.setLayoutManager(layout);
recyclerView.setAdapter(adapter);
recyclerView.addItemDecoration(new DividerGridItemDecoration(this));//添加分割线,继承RecyclerView.ItemDecoration
recyclerView.setItemAnimator(new DefaultItemAnimator());//设置默认Item增删动画
#Adapter的实现
1.自定义类继承RecycleView的Adapter同时绑定ViewHolder
class MyAdapter extends RecyclerView.Adapter<MyViewHolder>
2.实现方法
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater mInflater = LayoutInflater.from(context);
MyViewHolder holder = new MyViewHolder(mInflater.inflate(
R.layout.item_home, parent, false));
return holder;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.tv.setText(mDatas.get(position));
}
@Override
public int getItemCount() {
return mDatas.size();
}
3.MyViewHolder
class MyViewHolder extends RecyclerView.ViewHolder {
TextView tv;
public MyViewHolder(View view) {
super(view);
tv = (TextView) view.findViewById(R.id.id_num);
}
}
#增删Item的动画
#Adapter的实现
1.自定义类继承RecycleView的Adapter同时绑定ViewHolder
class MyAdapter extends RecyclerView.Adapter<MyViewHolder>
2.实现方法
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater mInflater = LayoutInflater.from(context);
MyViewHolder holder = new MyViewHolder(mInflater.inflate(
R.layout.item_home, parent, false));
return holder;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.tv.setText(mDatas.get(position));
}
@Override
public int getItemCount() {
return mDatas.size();
}
3.MyViewHolder
class MyViewHolder extends RecyclerView.ViewHolder {
TextView tv;
public MyViewHolder(View view) {
super(view);
tv = (TextView) view.findViewById(R.id.id_num);
}
}
#增删Item的动画
mDatas.add(position, "Insert One");
notifyItemInserted(position);//增加
mDatas.remove(position);
notifyItemRemoved(position);//删除
#设置点击监听
首先对MyAdapter.java代码做出如下修改:
①新建两个内部接口:
public interface OnItemClickListener{
void onItemClick(View view,int position);
}
public interface OnItemLongClickListener{
void onItemLongClick(View view,int position);
}
②新建两个私有变量用于保存用户设置的监听器及其set方法:
private OnItemClickListener mOnItemClickListener;
private OnItemLongClickListener mOnItemLongClickListener;
public void setOnItemClickListener(OnItemClickListener mOnItemClickListener){
this.mOnItemClickListener = mOnItemClickListener;
}
public void setOnItemLongClickListener(OnItemLongClickListener mOnItemLongClickListener) {
this.mOnItemLongClickListener = mOnItemLongClickListener;
}
③在onBindViewHolder方法内,实现回调:
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
holder.mTextView.setText(mDataSet.get(position));
//判断是否设置了监听器
if(mOnItemClickListener != null){
//为ItemView设置监听器
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = holder.getLayoutPosition(); // 1
mOnItemClickListener.onItemClick(holder.itemView,position); // 2
}
});
}
if(mOnItemLongClickListener != null){
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
int position = holder.getLayoutPosition();
mOnItemLongClickListener.onItemLongClick(holder.itemView,position);
//返回true 表示消耗了事件 事件不会继续传递
return true;
}
});
}
}
可以看到,这里实际上用到了子Item View的onClickListener和onLongClickListener这两个监听器,如果当前子item view被点击了,会触发点击事件进行回调,然后在①处获取当前点击位置的position值,接着在②号代码处进行再次回调,而这一次的回调是我们自己手动添加的,需要实现上面所述的接口。
修改完MyAdapter.java后,我们接着在MainActivity.java中设置监听器,采用匿名内部类的形式实现了onItemClickListener、onItemLongClickListener接口,这种写法与一般的设置监听器的流程相同:
mAdapter = new MyAdapter(mData);
mAdapter.setOnItemClickListener(new MyAdapter.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
Toast.makeText(MainActivity.this, "click " + mData.get(position), Toast.LENGTH_SHORT).show();
}
});
mAdapter.setOnItemLongClickListener(new MyAdapter.OnItemLongClickListener() {
@Override
public void onItemLongClick(View view, int position) {
Toast.makeText(MainActivity.this,"long click "+mData.get(position),Toast.LENGTH_SHORT).show();
}
});
mRecyclerView.setAdapter(mAdapter);