关于RecyclerView,在很早以前就看到过,不过今天才对RecyclerView进行了了解,
这个控件是属于V7包下的,可以添加依赖
compile 'com.android.support:recyclerview-v7:23.1.0'
RecyclerView可以说是ListView的一种优化,强制使用ViewHolder,同时可以通过setLayoutManager进行不同布局的选择,总共有三种布局:
1.LinearLayoutManager 线性布局,LayoutManager的实现类,类型包括Vertical和Horizontal,
可以看到线性布局有三种构造函数
参数含义:当前上下文,将用于访问资源。
参数含义:context 上下文对象,orientation 布局里的数据展示的方向,有两种方式
LinearLayoutManager.HORIZONTAL,LinearLayoutManager.VERTICAL
如果设置为true,从最终的布局开始。
2.GridLayoutManager格子布局,继承自LinearLayoutManager,
实现效果类似GridView
3.StaggeredGridLayoutManager交错的格子布局,同样也是LayoutManager的实现
类,类型包括Vertical和Horizontal,与GridLayoutManager很相似,
不过是交错的格子,也就是宽高不等的格子视图,类似瀑布流的效果
下面详细介绍RecyclerView的使用:
1.在布局中添加控件:
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
2.在类中进行初始化:
private RecyclerView recyclerView;
//存放数据
private List<String> list;
//布局管理器
private android.support.v7.widget.RecyclerView.LayoutManager layoutManager;
//RecyclerView的Adapter
private MyAdapter myAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
//添加数据
list = new ArrayList<String>();
initData();
//设置RecyclerView的显示布局
recyclerView.setLayoutManager(layoutManager);
//这里添加动画,有一个默认的动画
recyclerView.setItemAnimator(new DefaultItemAnimator());
//可以添加item的下划线,也就是可以自动以,继承ItemDecoration
// recyclerView.addItemDecoration(new RecyclerView.ItemDecoration() {
// });
myAdapter = new MyAdapter(list,this);
recyclerView.setAdapter(myAdapter);
//自己添加点击回调
myAdapter.setOnItemClick(new MyAdapter.OnItemClick() {
@Override
public void click(View item, int position) {
Toast.makeText(MainActivity.this,position + "",Toast.LENGTH_LONG).show();
}
});
}
代码中有注释,这里就不过多解释,在其中Adapter需要我们通过继承RecyclerView.Adapte
进行编写。如果想自己定义ItemDecoration,可以继承ItemDecoration进行定义。
3.MyAdapter的编写:
编写类继承RecyclerView.adapter,并实现里面的三个方法:
@Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout,null); return new MyHolder(view,onItemClick); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {MyHolder hodler1 = (MyHolder) holder; hodler1.textView.setText(list.get(position)); } @Override public int getItemCount() { return list.size(); }
第一个函数返回ViewHolder,第二个函数ViewHolder和数据源的绑定,第三个函数
得到集合的个数。
实现ViewHoler类:
class MyHolder extends RecyclerView.ViewHolder implements View.OnClickListener { TextView textView; private OnItemClick onItemClick; public MyHolder(View itemView, OnItemClick onItemClick) { super(itemView); textView = (TextView) itemView.findViewById(R.id.textView); // itemView.setOnClickListener(this); // itemView.setOnLongClickListener(this); //点击回调 this.onItemClick = onItemClick; itemView.setOnClickListener(this); } //点击进行回调 @Override public void onClick(View v) { if(onItemClick != null){ onItemClick.click(itemView,getAdapterPosition()); } } }在ViewHolder中进行控件的绑定,
如果不考虑点击事件,一个RecyclerView的简单实用就实现了,但往往我们都有点击事件的处理,而RecyclerView本身并没有clickListener的监听,这就需要我们自己写回调进行处理,因为ViewHolder可以拿到每个Item的根布局,所以可以再ViewHolderzhogn中做文章
点击事件的处理:
1.进行接口的编写:
interface OnItemClick{ void click(View item,int position); } private OnItemClick onItemClick; public void setOnItemClick(OnItemClick onItemClick) { this.onItemClick = onItemClick; }在实现onCreateViewHolder方法时,创建ViewHolder对OnItemClick对象进行传递
2.在ViewHolder中对点击事件进行处理
class MyHolder extends RecyclerView.ViewHolder implements View.OnClickListener { TextView textView; private OnItemClick onItemClick; public MyHolder(View itemView, OnItemClick onItemClick) { super(itemView); textView = (TextView) itemView.findViewById(R.id.textView); // itemView.setOnClickListener(this); // itemView.setOnLongClickListener(this); //点击回调 this.onItemClick = onItemClick; itemView.setOnClickListener(this); } //点击进行回调 @Override public void onClick(View v) { if(onItemClick != null){ onItemClick.click(itemView,getAdapterPosition()); } } }在构造函数中进行OnItemClick的赋值,同时设置每个条目的点击事件,在ItemView的点击事件中进行OnItemClick的判断,同时实现点击。
关于点击事件的了解可看点击打开链接