Android中快速入门RecyclerView

PS:文章末尾有案例下载哦!

RecyclerView 使用

RecyclerView 是 android-support-v7包中的一个控件,是一个强大的列表展示滑动组件,它的原理与listView有很多相似的地方,都是维护少量的View来进行显示大量的数据,不过RecyclerView控件比ListView更加高级并且更加灵活。

一、RecycleView的优点:

  • 提供了一种插拔式的体验,高度的解耦,异常的灵活,通过设置它提供的不同LayoutManager,ItemDecoration , ItemAnimator实现令人瞠目的效果。

二、RecycleView的主要方法:

  • 你想要控制其显示的方式,请通过布局管理器LayoutManager
  • 你想要控制Item间的间隔(可绘制),请通过ItemDecoration
  • 你想要控制Item增删的动画,请通过ItemAnimator
  • 你想要控制点击、长按事件,请自己写(擦,这点尼玛。)

三、RecycleView的使用:

1、在gradle中添加jar包依赖:

 compile 'com.android.support:recyclerview-v7:24.0.0'

2、基本使用

mRecyclerView = findView(R.id.id_recyclerview);
//设置布局管理器
mRecyclerView.setLayoutManager(layout);
//设置adapter
mRecyclerView.setAdapter(adapter)
//设置Item增加、移除动画
mRecyclerView.setItemAnimator(new DefaultItemAnimator());

ok,相比较于ListView的代码,ListView可能只需要去设置一个adapter就能正常使用了。而RecyclerView基本需要上面一系列的步骤,那么为什么会添加这么多的步骤呢?

那么就必须解释下RecyclerView的这个名字了,从它类名上看,RecyclerView代表的意义是,我只管Recycler View,也就是说RecyclerView只管回收与复用View,其他的你可以自己去设置。可以看出其高度的解耦,给予你充分的定制自由(所以你才可以轻松的通过这个控件实现ListView,GirdView,瀑布流等效果)。

3、简单实现

public class MainActivity extends AppCompatActivity {

    private RecyclerView mRecyclerView;
    private List<String> mDatas;
    private MyAdapter mAdapter;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

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

        initData();
        //设置布局管理器
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        //设置adapter
        mRecyclerView.setAdapter(mAdapter= new MyAdapter());
        //设置Item增加、移除动画
    }

    protected void initData()
    {
        mDatas = new ArrayList<>();
        for (int i = 0; i < 30; i++)
        {
            mDatas.add(i + "");
        }
    }


    class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{

        @Override
        public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            MyViewHolder holder = new MyViewHolder(LayoutInflater.from(
                    MainActivity.this).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();
        }

        class MyViewHolder extends RecyclerView.ViewHolder{
            TextView tv;

            public MyViewHolder(View itemView) {
                super(itemView);
                tv = (TextView) itemView.findViewById(R.id.item_tv);
            }
        }
    }
}

activity布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

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

item布局,加了一行白线,作为伪分割线。

我们可以通过该方法添加分割线: mRecyclerView.addItemDecoration() 该方法的参数为RecyclerView.ItemDecoration,该类为抽象类,官方目前并没有提供默认的实现类

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@android:color/black">

<TextView
    android:id="@+id/item_tv"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textColor="@android:color/white"
    android:text="111"
    android:layout_centerInParent="true"/>

<TextView
    android:layout_width="match_parent"
    android:layout_height="1dp"
    android:background="@android:color/white"
    android:layout_alignParentBottom="true"/>

</RelativeLayout>

4、自定义Adapter:

参考案例中的自定义Adapter

四、RecycleView主要方法的使用:

1、LinearLayoutManager布局:

垂直布局:

mRecyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false));

水平布局:

mRecyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false));

2、GridLayoutManager布局:

mRecyclerView.setLayoutManager(new GridLayoutManager(this, 3));

3、StaggeredGridLayoutManager布局:

垂直布局:

mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL));

水平布局:

mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.HORIZONTAL));

4、设置item的动画效果:

RecyclerView 给我们提供了动画,默认动画是 DefaultItemAnimator。

5、Item的点击事件:

RecyclerView中默认没有提供onItemClick和onItemLongClick点击事件方法,需要我们自己在适配器中写接口来实现。

设置如下:

private OnItemClickListener mOnItemClickListener;

public interface OnItemClickListener {
    void onItemClick(View view, int postion);

    void onItemLongClick(View view, int postion);
}

//对外提供的一个监听方法
public void setOnItemClickListener(OnItemClickListener listener) {
    this.mOnItemClickListener = listener;
}

在onBindViewHolder()中调用接口

 //如果设置了监听那么它就不为空,然后回调相应的方法
    if (mOnItemClickListener != null) {
        myViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //得到当前点击item的位置postion
                int postion = myViewHolder.getLayoutPosition();
                mOnItemClickListener.onItemClick(myViewHolder.itemView, postion);
            }
        });
        myViewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                int postion = myViewHolder.getLayoutPosition();
                mOnItemClickListener.onItemLongClick(myViewHolder.itemView, postion);
                return true;
            }
        });
    }

关注微信公众号,更多优质文章等你阅读!

案例下载地址:https://github.com/AndStuFeng/RecyclerView-Test

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值