1.RecylerView是什么
RecylerView是support-v7包中的新组件,和ListView一样有item回收复用的功能,同时,又是listView的升级版,它封装了viewholder的回收复用,也就是说RecylerView标准化了ViewHolder,编写Adapter面向的是ViewHolder而不再是View了;它提供了一种插拔式的体验,高度的解耦,异常的灵活,针对一个Item的显示RecyclerView专门抽取出了相应的类,来控制Item的显示,使其的扩展非常强。
2.ViewHolder和Adapter
RecyclerView的任务仅限于回收和定位屏幕上的View。还有另外两个类:ViewHoler和Adapter。
ViewHolder就是容纳View视图。
Adapter创建必要的ViewHoler,绑定ViewHoler至模型层数据
3.使用RecylerView
先要添加RecylerView依赖库,单击File->Project Structure菜单项切换至项目结构窗口,选择左边的app模块,单机Dependencies选项页,单击+按钮添加依赖库
也可以在build.gradle中添加,如图
这里的例子是帖子信息显示
我们可以新建一个fragment_post_list布局文件,修改根视图为RecyclerView
下面是视图和fragment关联,新建PostListFragment文件,让他的布局为RecyclerView
public class PostListFragment extends Fragment {
private RecyclerView mPostRecyclerView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.fragment_post_list,container,false);
mPostRecyclerView=(RecyclerView)view.findViewById(R.id.post_recycler_view);
mPostRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
return view;
}
注意这个时候如果没有LayoutManager我们的RecyclerView无法工作,会导致应用崩溃,我们应该创建完成后立即交给LayoutManager
现在需要初始的Activity文件中托管我们的fragment文件
public class PostListActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragment);
FragmentManager fm=getSupportFragmentManager();
Fragment fragment=fm.findFragmentById(R.id.fragment_container);
if(fragment==null){
fragment=new PostListFragment();
fm.beginTransaction()
.add(R.id.fragment_container,fragment)
.commit();
}
}
}
然后运行发现是一个空的界面
3.1列表项视图
我们的列表里面有很多的数据,我们要创建一个视图布局一条条根据自己的需要拜访它
新建一个list_item_crime文件
3.2实现ViewHolder、Adapter
我们需要实例化并使用刚刚新建的list_item_crime布局
定义ViewHolder(PostListFragment.java)
private class PostHolder extends RecyclerView.ViewHolder{
public PostHolder(LayoutInflater inflater,ViewGroup parent){
super(inflater.inflate(R.layout.list_item_post,parent,false));
}
}
定义Adapter(PostListFragment.java)
private class PostAdapter extends RecyclerView.Adapter{
private List mPosts;
public PostAdapter(List posts){
mPosts=posts;
}
@Override
public PostHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflater=LayoutInflater.from(getActivity());
return new PostHolder(layoutInflater,parent);
}
@Override
public void onBindViewHolder(PostHolder holder, int position) {
}
@Override
public int getItemCount() {
return mPosts.size();
}
}
接下来我们要将Adapter和RecyclerView关联起来,实现一个设置PostListFragment用户界面的updateUI方法,创建PostAdapter,然后设置给RecyclerView
public class PostListFragment extends Fragment {
...
private PostAdapter mAdapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.fragment_post_list,container,false);
mPostRecyclerView=(RecyclerView)view.findViewById(R.id.post_recycler_view);
mPostRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
updateUI();
return view;
}
private void updateUI(){
PostLab postLab=PostLab.get(getActivity());
List posts=postLab.getPosts();
mAdapter=new PostAdapter(posts);
mPostRecyclerView.setAdapter(mAdapter);
}
}
3.2绑定列表项
让java代码和组件关联起来。
private class PostHolder extends RecyclerView.ViewHolder {
private Post mPost;
private TextView mTitleTextView;
private TextView mDateTextView;
public void bind(Post post){
mPost=post;
mTitleTextView.setText(mPost.getTitle());
mDateTextView.setText(mPost.getDate().toString());
}
public PostHolder(LayoutInflater inflater,ViewGroup parent){
super(inflater.inflate(R.layout.list_item_post,parent,false));
mTitleTextView=(TextView) itemView.findViewById(R.id.post_title);
mDateTextView=(TextView) itemView.findViewById(R.id.post_date);
}
现在只要取到一个Post,PostHolder就会刷新显示TextView标题视图和TextView日期视图,记得调用bind(Post)方法
@Override
public void onBindViewHolder(PostHolder holder, int position) {
Post post=mPosts.get(position);
holder.bind(post);
}
运行
3.2响应点击
现在先达到点击一下弹出一个toast的效果,RecycleView功能强大,但是要自己处理触摸事件,虽然它也能帮我们转发触摸事件,不过大多数时候还是没必要这么做的
通过修改PostHolder类处理用户点击事件
private class PostHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
public PostHolder(LayoutInflater inflater,ViewGroup parent){
super(inflater.inflate(R.layout.list_item_post,parent,false));
mTitleTextView=(TextView) itemView.findViewById(R.id.post_title);
mDateTextView=(TextView) itemView.findViewById(R.id.post_date);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View view) {
Toast.makeText(getActivity(),mPost.getTitle()+" clicked!",Toast.LENGTH_SHORT).show();
}
}
点击某个列表项,可看到弹出的toast响应消息