RecyclerView简单的使用

来源:互联网 发布:8寸windows平板电脑 编辑:程序博客网 时间:2024/05/20 06:09

RecyclerView的使用

1 引入recyclerView

在moudle中的build.gradle文件里,找到dependencies,添加关于recyclerView的引用:

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

其实design包中含有Material Design相关的很多控件,其中也包括了recyclerView的代码,所以你也可以通过引用design包来使用recyclerView:

compile 'com.android.support:design:23.2.0'

注意:所引用的依赖包版本需要和自己dependencies中对应的support:v7包版本一致才能使用

2 在xml中写一个recyclerView

在MainActivity中添加一个RecyclerView进行展示,代码如下:

<!--省略不提...-->        <android.support.v7.widget.RecyclerView            android:layout_width="match_parent"            android:layout_height="match_parent"            android:id="@+id/recyclerView"/><!--省略不提...-->

3 在java中给recyclerView设置数据

在MainActivity中的代码如下:

    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();        initData();    }    private void initData() {        ArrayList<String> datas = new ArrayList<>();        for(char i ='A';i<='Z';i++){            datas.add(i+"");        }        mAdapter = new MyAdapter(datas);        rv.setAdapter(mAdapter);    }    private void initView() {        rv = (RecyclerView) findViewById(R.id.recyclerView);        //必须要指定展示的效果,设置一个LayoutManager,不然还是会一片空白        LinearLayoutManager llm = new LinearLayoutManager(getApplicationContext());        rv.setLayoutManager(llm);    }

在MyAdapter中的代码如下:

public class MyAdapter extends RecyclerView.Adapter {    private ArrayList<String> datas;    private Context mContext;    public MyAdapter(Context applicationContext, ArrayList<String> datas) {        this.datas = datas;        this.mContext = applicationContext;    }    //RecyclerView的Adapter已经集成了ViewHolder    //getView中的两段逻辑 1 创建view对象(将xml转为view)   2 找到view对象里面的一些控件,对其进行一些展示的设置    //onCreateViewHolder 中执行第一段逻辑,创建出view,设置到一个ViewHolder中,再将holder返回    @Override    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        //第三个参数为false,如果为true的话,生成的这个view其实就是第二个参数指向的parent,会造成报错的        View view = LayoutInflater.from(mContext).inflate(R.layout.item_recyclerview, parent,false);        MyViewHolder holder = new MyViewHolder(view);        return holder;    }    //给holder里的控件设置数据    @Override    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {        ((MyViewHolder)holder) .mTextView.setText(datas.get(position));    }    //Count 控制控件有多少个item    @Override    public int getItemCount() {        return datas.size();    }}class MyViewHolder extends RecyclerView.ViewHolder{    public TextView mTextView;    public MyViewHolder(View itemView) {        super(itemView);        mTextView = (TextView) itemView.findViewById(R.id.tv_item);    }}

4 给recyclerView设置不同的展示效果

设置多个按钮来修改recyclerView的不同的显示方式

<LinearLayout  android:layout_width="match_parent"        android:orientation="horizontal"        android:layout_height="wrap_content">    <Button        android:id="@+id/action_listview"        android:layout_weight="1"        android:layout_width="0dp"        android:layout_height="match_parent"        android:text="listView"        app:showAsAction="never"/>    <Button        android:id="@+id/action_gridview"        android:layout_weight="1"        android:layout_width="0dp"        android:layout_height="match_parent"        android:text="gridView"/>    <Button        android:id="@+id/action_hor_gridview"        android:layout_weight="1"        android:layout_width="0dp"        android:layout_height="match_parent"        android:text="横向的gridView"/>    <Button        android:id="@+id/action_stagger"        android:layout_weight="1"        android:layout_width="0dp"        android:layout_height="match_parent"        android:text="交错的瀑布流"/></LinearLayout>

然后在MainActivity中,修改菜单代码:

   @Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.action_listview:                LinearLayoutManager llm = new LinearLayoutManager(this);                rv.setLayoutManager(llm);                break;            case R.id.action_gridview:                GridLayoutManager rlm = new GridLayoutManager(this, 3);                rv.setLayoutManager(rlm);                break;            case R.id.action_hor_gridview:                GridLayoutManager hrlm = new GridLayoutManager(this, 3,                        GridLayoutManager.HORIZONTAL, false);                rv.setLayoutManager(hrlm);                break;            case R.id.action_stagger:                StaggeredGridLayoutManager sglm = new StaggeredGridLayoutManager(3,                        StaggeredGridLayoutManager.VERTICAL);                rv.setLayoutManager(sglm);                break;        }    }

其实就是设置了不同的LayoutManager给RecyclerView而已。

5 给RecyclerView 设置添加和删除item的方法

先给Adapter设置两个方法

/** * 添加Item的方法 * @param position 所添加的位置 * @param item  所添加的内容(这里以String为例) */public void addItem(int position, String item){}/** * 删除Item的方法 * @param position 所删除的位置 */public void deleteItem(int position){}

然后再给对应的方法实现功能,可以直接修改集合里面的内容

/** * 添加Item的方法 * @param position 所添加的位置 * @param item  所添加的内容(这里以String为例) */public void addItem(int position, String item){    datas.add(position,item);    //notifyDataSetChanged();     notifyItemInserted(position);}/** * 删除Item的方法 * @param position 所删除的位置 */public void deleteItem(int position){    datas.remove(position);  //notifyDataSetChanged();    notifyItemRemoved(position);}

通常的ListView都是使用notifyDataSetChanged();这个方法刷新,recyclerView 使用它对应的

(添加 notifyItemInserted(position);)(删除notifyItemRemoved(position);)方法,在修改对应item的时候会有动画效果产生

再添加两个按钮,点击时就插入、删除数据。修改xml代码如下:

<LinearLayout  android:layout_width="match_parent"        android:orientation="horizontal"        android:layout_height="wrap_content">    ...    <Button        android:id="@+id/action_add"        android:layout_weight="1"        android:layout_width="0dp"        android:layout_height="match_parent"        android:text="添加"/>    <Button        android:id="@+id/action_delete"        android:layout_weight="1"        android:layout_width="0dp"        android:layout_height="match_parent"        android:text="删除"/></LinearLayout>

在MainActivity中调用方法代码如下:

   @Override    public void onClick(View v) {        switch (v.getId()) {            ...            case R.id.action_add:                mAdapter.addItem(2,"加进去的");                break;            case R.id.action_delete:                mAdapter.deleteItem(2);                break;        }    }

6 给RecyclerView设置动画效果

可以通过rv.setItemAnimator();设置动画,里面可以new 一个相关的类,并实现对应的方法写出自己所需要实现的动画效果.

rv.setItemAnimator(new DefaultItemAnimator());rv.setItemAnimator(new RecyclerView.ItemAnimator() {});rv.setItemAnimator(new SimpleItemAnimator() {});

​ 通过寻找,在GitHub上面找到了一个已经实现好了的recyclerView的动画效果集合, 基本上可以满足所需要的动画效果:[recyclerView animators][https://github.com/wasabeef/recyclerview-animators ]

把下面对应的动画对象放入方法中,就能实现对应的动画效果

Cool

LandingAnimator

Scale

ScaleInAnimator, ScaleInTopAnimator, ScaleInBottomAnimator

ScaleInLeftAnimator, ScaleInRightAnimator

Fade

FadeInAnimator, FadeInDownAnimator, FadeInUpAnimator

FadeInLeftAnimator, FadeInRightAnimator

Flip

FlipInTopXAnimator, FlipInBottomXAnimator

FlipInLeftYAnimator, FlipInRightYAnimator

Slide

SlideInLeftAnimator, SlideInRightAnimator, OvershootInLeftAnimator, OvershootInRightAnimator

SlideInUpAnimator, SlideInDownAnimator

代码如下:

LandingAnimator scaleInAnimator = new LandingAnimator();rv.setItemAnimator(scaleInAnimator);ScaleInAnimator animator = new ScaleInAnimator();rv.setItemAnimator(animator);...

7 给ReyclerView添加点击效果

RecyclerView没有提供OnItemClick相关的item点击方法,需要自己去实现。这里是通过在Adapter中去实现的。在Adapter中先自定义一个OnItemClickListener,然后在Adapter中的onBindViewHolder方法中,给holder.itemView设置OnClickListener,并在OnClickListener的点击方法中,调用自定义的OnItemClickListener。代码如下:

    //给holder里的控件设置数据    @Override    public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {        ((MyViewHolder)holder) .mTextView.setText(datas.get(position));        //给item添加一个点击        holder.itemView.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {//                Toast.makeText(mContext, "点击了item"+position, Toast.LENGTH_SHORT).show();                mOnItemClickListener.onItemClick(position,holder.itemView);            }        });    }    public void setOnItemClickListener(OnItemClickListener onItemClickListener){        this.mOnItemClickListener = onItemClickListener;    }    private OnItemClickListener mOnItemClickListener = null;    public interface OnItemClickListener{        void onItemClick(int position,View itemView);    }

然后在MainActivity中设置自定义的OnItemClickListener即可。代码如下:

    private void initData() {        ....        mAdapter.setOnItemClickListener(new MyAdapter.OnItemClickListener() {            @Override            public void onItemClick(int position, View itemView) {                Toast.makeText(MainActivity.this, "position: "+position, Toast.LENGTH_SHORT).show();            }        });    }

8 给RecyclerView设置分割线

RecyclerView不像ListView,它没有已设置好的分割线,需要自己处理。给RecyclerView设置分割线需要执行以下代码:

rv.addItemDecoration(new RecyclerView.ItemDecoration() {            String str = "我是分割线";            @Override            public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {               ....                    c.drawText(str,left,top,paint);                }            }            @Override            public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {                //通过outRect设置各个item之间的位移间距                outRect.set(0,0,0,getStringHeight(paint));            }        });

需要给RecyclerView设置一个ItemDecoration,如果不想自己去实现里面的方法,可以参考一些三方库,如:[recyclerview-flexibledivider][https://github.com/yqritc/RecyclerView-FlexibleDivider ]

原创粉丝点击