RecyclerView的使用

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选项页,单击+按钮添加依赖库


RecyclerView的使用_第1张图片
image.png

也可以在build.gradle中添加,如图


RecyclerView的使用_第2张图片
image.png

这里的例子是帖子信息显示
我们可以新建一个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();
        }
    }
}

然后运行发现是一个空的界面


RecyclerView的使用_第3张图片
image.png

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);
    }
}
RecyclerView的使用_第4张图片
image.png

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);
        }

运行


RecyclerView的使用_第5张图片
image.png

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响应消息


RecyclerView的使用_第6张图片
image.png

你可能感兴趣的:(RecyclerView的使用)