RecyclerView特性和使用

来源:互联网 发布:电子琴与电钢琴 知乎 编辑:程序博客网 时间:2024/06/05 18:12

RecyclerView 的由来

  • 根据谷歌官方的说明:A flexible view for providing a limited window into a large data set。能够在有限的窗口中展示大数据几个的灵活滑动视图。
  • 集合了ListView ,和GirdView,并且标准化了ViewHolder,逻辑被封装了,复用更方便。
  • 可以通过布局管理器LayoutManager可以控制item的布局样式,可以设置item的出场动画,设置分割线样式,达到高解耦

RecyclerView 的用法

  • RecyclerView 是Support Library的一部分。所以只需要在app/build.gradle中添加以下依赖,便能立即使用或者引用v7包:
compile 'com.android.support:recyclerview-v7:25.3.1'     
  • xml中引入:
<android.support.v7.widget.RecyclerView        android:id="@+id/recycler_view"        android:layout_width="match_parent"        android:layout_height="match_parent" />
  • 相关配置
    //设置布局管理器
 mRecyclerView.setLayoutManager(layoutManager);
//设置adapter```mRecyclerView.setAdapter(adapter);```//设置item增加、移除动画```mRecyclerView.setItemAnimator(new DefaultItemAnimator);```//添加分割线```mRecyclerView.addItemDecoration(new DividerItemDecoration(getActivity(),DividerItemDecoration.HORIZONTAL_LIST));```
public class HomeActivity extends ActionBarActivity{    private RecyclerView mRecyclerView;    private List<String> mDatas;    private HomeAdapter mAdapter;    @Override    protected void onCreate(Bundle savedInstanceState)    {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_single_recyclerview);        initData();        mRecyclerView = (RecyclerView) findViewById(R.id.id_recyclerview);        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));        mRecyclerView.setAdapter(mAdapter = new HomeAdapter());    }    protected void initData()    {        mDatas = new ArrayList<String>();        for (int i = 'A'; i < 'z'; i++)        {            mDatas.add("" + (char) i);        }    }    class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.MyViewHolder>    {        @Override        public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType)        {            MyViewHolder holder = new MyViewHolder(LayoutInflater.from(                    HomeActivity.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 ViewHolder        {            TextView tv;            public MyViewHolder(View view)            {                super(view);                tv = (TextView) view.findViewById(R.id.id_num);            }        }    }}

1,设置ReceyclerView.ViewHolder
跟listview一样的,用来存放item的对象的,来解决list的优化问题,不用在去设置tag标记了,例子代码如下:

    public static class MyViewHolder extends RecyclerView.ViewHolder{                TextView tv;        //ViewHolder是示例Adapter的内部类        public MyViewHolder(View itemView) {                        super(itemView);            tv = (TextView) itemView.findViewById(R.id.tv);        }    }

2,设置分割线
listview里面是有设置分割线的属性的android:dividerHeight="10dp",但是ReceyclerView是没有支持divider这样的属性,当然你也可以去item里添加分割线或增加margin,但是ReceyclerView更加强大的是可以通过方法自定义分割线mRecyclerView.addItemDecoration(),常用的:

// 给纵向显示RecyclerView设置分割线recyclerView.addItemDecoration(new DividerItemDecoration(activity,DividerItemDecoration.VERTICAL));// 给横向显示RecyclerView设置分割线recyclerView.addItemDecoration(new DividerItemDecoration(activity,DividerItemDecoration.HORIZONTAL));

其他的不同样式可以自定义类去继承RecyclerView.ItemDecortion,比如:

public class SimpleDividerItemDecoration extends RecyclerView.ItemDecoration {      private Drawable mDivider;      public SimpleDividerItemDecoration(Context context) {          mDivider = context.getResources().getDrawable(R.drawable.line_divider);      }      @Override      public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {          int left = parent.getPaddingLeft();          int right = parent.getWidth() - parent.getPaddingRight();          int childCount = parent.getChildCount();          for (int i = 0; i < childCount; i++) {              View child = parent.getChildAt(i);              RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();              int top = child.getBottom() + params.bottomMargin;              int bottom = top + mDivider.getIntrinsicHeight();              mDivider.setBounds(left, top, right, bottom);              mDivider.draw(c);          }      }  } 

3,设置动画效果ItemAnimator
ItemAnimator能帮助Item实现独立的动画。而触发于以下三种事件:
(1)某条item数据被插入到数据集合中
(2)从数据集合中移除某条数据
(3)更改数据集合中的某条数据
可以通过以下代码为item增加动画效果:

recyckerView.setItemAnimator(new DefaultItemAnimator());

在adapter中去添加 插入inserted方法和移除remove方法 如下:

public void addData(int position){    mDatas.add("数据集合");//数据添加    notifyItemInseted(position);}public void removeData(int position){    mDatas.remove(position);//数据移除    notifyItemRemoved(position)}

瀑布流效果实现几步OK:
1,
mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(3,
StaggeredGridLayoutManager.VERTICAL));
设置为错位网格布局管理器StaggeredGridLayoutManager,并设置方向为竖直。
2,在adapter中去设置错位高度

@Override    public void onBindViewHolder(final MyViewHolder holder, final int position)    {        LayoutParams lp = holder.ll.getLayoutParams();        lp.height = mHeights.get(position);        holder.ll.setLayoutParams(lp);        holder.ll.setText(mDatas.get(position));        ........        ........    }

横向的recyclerView的实现:

LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getApplication()); linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);recyclerView.setLayoutManager(linearLayoutManager);

剩下的适配步骤同上
一般横向滑动是不需要scrollbars的,也不需要过度滑动的阴影效果,5.0以上需要以下设置:

<android.support.v7.widget.RecyclerView    android:id="@+id/rv_img"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:overScrollMode="never"    android:scrollbars="none" />

listview配置如下:

<ListView    android:id="@+id/lv_list"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:overScrollFooter="@android:color/transparent"    android:overScrollHeader="@android:color/transparent"    android:overScrollMode="never"    android:scrollbars="none">

用法也就这些了!对于添加头布局和脚布局最好用到开源库RefreshLoadMoreLayout去添加。
自定义对于网格布局的脚布局存在错位问题。