Material Design控件使用总结之RecyclerView(一)基本使用

参考:
张鸿洋博客
Android RecyclerView 使用完全解析 体验艺术般的控件

为RecyclerView打造通用Adapter 让RecyclerView更加好用

腾讯Bugly干货分享–RecyclerView必知必会

介绍

RecyclerView是Android5.0的新控件,可以用来替代ListView,用来显示一个列表。作为小白,对新出的控件还是很喜欢的,毕竟在设计上真的进步很多,符合审美。RecyclerView相对于ListView有更好的扩展性,默认实现了View的复用,支持局部刷新,实现Item动画、拖拽、侧滑等功能会更容易。但是没有addHeaderView()和addFooterView()来添加头部视图和底部视图,对Item的点击也没有直接的接口,需要自己实现,而这些在ListView中很容易实现。RecyclerView的出现并不是完全取代了ListView,他们各有自身的优点和缺点,根据需要选择就好。

一、基本使用

1、作为新增控件,需要在build.gradle中添加相应的依赖库。和TabLayout导入依赖库的方法相同。

    compile 'com.android.support:appcompat-v7:26.+'
    compile 'com.android.support:design:26.+' // 导入所有新控件
compile 'com.android.support:recyclerview-v7:26.+' //只导入recyclerview

此处导入所有的新控件,也可以只导入recyclerview,选择其一即可

代码:

布局文件:


    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

Activity:

    recyclerView = (RecyclerView) findViewById(R.id.recycler);

  recyclerView.setLayoutManager(new
                LinearLayoutManager(this, LinearLayoutManager.VERTICAL,false));
        adapter = new LinearRecyclerAdapter(this);
         // 初始化数据
        initData();
        adapter.addData(mDatas);
        // 设置adapter
        recyclerView.setAdapter(adapter);

Adapter:

public class LinearRecyclerAdapter extends RecyclerView.Adapter<LinearRecyclerAdapter.ViewHolder> {
    private Context context;
    private List<String> datas;

    public LinearRecyclerAdapter(Context context) {
        this.context = context;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.item_list,parent,false);
        ViewHolder holder = new ViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.tv.setText(datas.get(position));
    }


    @Override
    public int getItemCount() {
        return datas.size();
    }

    public void addData(List<String> mDatas) {
        datas = new ArrayList<>();
        this.datas = mDatas;
    }

    static class ViewHolder extends RecyclerView.ViewHolder{

        TextView tv;

        public ViewHolder(View itemView) {
            super(itemView);
            tv = itemView.findViewById(R.id.tv_item_content);
        }
    }
}

运行之后,是这个样子的,基本的列表功能实现了
S71214-195519.jpg

当然由于RecyclerView的扩展性较好,当你想改变布局的时候,只需修改LayoutManager即可。例如GridView的效果,只需在setLayoutManager()时传入GridLayoutManager即可。

 recyclerView.setLayoutManager(new GridLayoutManager(this,4));

ps:备注小白的困惑(再传入不同的LayoutManage时,对各个参数不理解,可查看官网的文档或尝试查看源码帮助理解)。

 recyclerView.setLayoutManager(new StaggeredGridLayoutManager(4,
                StaggeredGridLayoutManager.HORIZONTAL));

二、添加分割线和点击事件

添加分割线

对于列表形式的下划线,可以通过在Item布局中添加个View来实现,如果是网格布局或者瀑布流布局,通过画线的形式实现会比较繁琐。如果项目中有很多需要线的时候,会增加代码的冗余度。 recyclerView.addItemDecoration();里面传入一个ItemDecoration对象,ItemDecoration是一个抽象类,自定义该类的子类就可以实现画线了,具体参看Android RecyclerView 使用完全解析 体验艺术般的控件可以理解为自定义View,我是这样理解的。

添加点击事件

RecyclerView并没有提供Item的点击事件,需要我们自己实现,也许是考虑到扩展性吧,例如你只想点击Item中的某个组件而不是整个Item之类的,可以直接在adapter中为组件设置点击事件,不用监听整个Item的点击。如果监听整个Item的点击,在adapter中提供回调就可以实现了
代码:

 public interface OnItemClickLitener
    {
        void onItemClick(View view, int position);
        void onItemLongClick(View view , int position);
    }

    private OnItemClickLitener mOnItemClickLitener;

    public void setOnItemClickLitener(OnItemClickLitener mOnItemClickLitener)
    {
        this.mOnItemClickLitener = mOnItemClickLitener;
    }

    @Override
    public void onBindViewHolder(final MyViewHolder holder, final int position)
    {
        holder.tv.setText(mDatas.get(position));

        // 如果设置了回调,则设置点击事件
        if (mOnItemClickLitener != null)
        {
            holder.itemView.setOnClickListener(new OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    int pos = holder.getLayoutPosition();
                    mOnItemClickLitener.onItemClick(holder.itemView, pos);
                }
            });

            holder.itemView.setOnLongClickListener(new OnLongClickListener()
            {
                @Override
                public boolean onLongClick(View v)
                {
                    int pos = holder.getLayoutPosition();
                    mOnItemClickLitener.onItemLongClick(holder.itemView, pos);
                    return false;
                }
            });
        }
    }

在Activity中,通过adapter.setOnItemClickListener()重写方法,即可实现点击事件。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值