RecyclerView特性和使用

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去添加。
自定义对于网格布局的脚布局存在错位问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RecyclerView 和 OkHttp 都是 Android 开发中非常常用的库。 RecyclerView 是 Android 官方在 API level 21 中推出的一个用于列表展示的组件,相比起 ListViewRecyclerView 的优点在于支持更加丰富的布局和动画,并且可以通过 ViewHolder 模式进行更高效的显示和数据更新。而且它也可以很好地与其他组件进行集成,比如 SwipeRefreshLayout、ItemTouchHelper 等等,为开发者提供了更丰富的选项。 而 OkHttp 则是一款非常流行的 HTTP 客户端库,它的优点在于简单易用,性能好且支持丰富的功能。通过 OkHttp,我们可以轻松地发起 HTTP 请求,并且可以直接将响应数据转化为常用的格式(比如 JSON)。同时,OkHttp 也支持网络拦截器、缓存、连接池、SSL、WebSocket 等特性,从而满足开发者在实际开发中的需求。 结合 RecyclerView 和 OkHttp,我们可以实现许多常见的需求。比如,我们可以通过 OkHttp 发起网络请求获取数据,并且通过 RecyclerView 将这些数据在列表中进行展示。我们也可以通过 OkHttp 实现图片的异步加载,并且使用 RecyclerView 实现图片列表的展示。当然,如果需要更加高级的功能,比如分页、筛选、搜索等,开发者也可以借助 OkHttp 和 RecyclerView 的优势来实现这些功能。 综上所述,RecyclerView 和 OkHttp 都是非常好用的 Android 库,开发者在日常工作中都会频繁使用它们。当然,开发者也需要结合自身的实际情况,根据项目需求来选择合适的库,从而更快更好地进行开发。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值