Android RecyclerView

简介

  RecyclerView是从Android 5.0开始,谷歌公司推出的一个用于大量数据展示的心控件,在一定程度上可以代替

传统的ListView,更强大,更灵活

  RecyclerView是v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有Item的的回收复用功能,.

RecyclerView的优势:

  RecyclerView并不能完全替代ListView,两者的使用场景不一样,相比于Lisetview的优点:

  1.RecyclerView封装了Viewholder的回收复用,也就是说RecyclerView标准化了Viewholder,编写Adapter面向的是Viewholder而不是View.

  2.提供了一种插拔式的体验,高度的解耦,异常的灵活,针对一个Item的显示RecyclerView专门抽取出了相应的类,来控制Item的显示,使其的扩展性非常强。

  3.设置布局管理器以控制Item的布局方式,横向、竖向以及瀑布流方式
例如:你想控制横向或者纵向滑动列表效果可以通过LinearLayoutManager这个类来进行控制(与GridView效果对应的是GridLayoutManager,与瀑布流对应的还StaggeredGridLayoutManager等)。也就是说RecyclerView不再拘泥于ListView的线性展示方式,它也可以实现GridView的效果等多种效果。

  4.可设置Item的间隔样式(可绘制)
通过继承RecyclerView的ItemDecoration这个类,然后针对自己的业务需求去书写代码。

  5.可以控制Item增删的动画,可以通过ItemAnimator这个类进行控制,当然针对增删的动画,RecyclerView有其自己默认的实现。

  但是关于item的点击和长按事件,需要用户自己取实现

基本使用:

导入依赖

    implementation 'com.android.support:recyclerview-v7:28.0.0'
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);  
LinearLayoutManager layoutManager = new LinearLayoutManager(this );  
//设置布局管理器  
recyclerView.setLayoutManager(layoutManager);  
//设置为垂直布局,这也是默认的  
layoutManager.setOrientation(OrientationHelper. VERTICAL);  
//设置Adapter  
recyclerView.setAdapter(recycleAdapter);  
 //设置分隔线  
recyclerView.addItemDecoration( new DividerGridItemDecoration(this ));  
//设置增加或删除条目的动画  
recyclerView.setItemAnimator( new DefaultItemAnimator());

  在使用RecyclerView的时候,必须指定一个适配器和一个布局管理器

  适配器Apdater继承RecyclerView.Adapter类

创建适配器步骤
  1.创建Adapter继承 RecyclerView.Adapter<VH>的Adapter类(VH是ViewHolder的类名)
  2.创建ViewerHolder,继承 RecyclerView.ViewHolder实现方式基本与lisetview一样
  3.实现3个方法
    onCreateViewHolder()
    onBindViewHolder()
    getItemCount()
代码示例:
package com.hejun.movie;

import android.content.Context;
import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RatingBar;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.orhanobut.logger.Logger;

import java.io.Serializable;
import java.util.List;


import butterknife.BindView;
import butterknife.ButterKnife;

class GridAdapter extends RecyclerView.Adapter<GridAdapter.ViewHolder> {

    private Context context;
    private List<JsonBean.MoviesBean> list;

    public GridAdapter(Context context, List<JsonBean.MoviesBean> list) {
        this.context = context;
        this.list = list;
    }

    /**
     * 加载item布局
     * @param viewGroup
     * @param i
     * @return
     */
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {

        View view = LayoutInflater.from(context).inflate(R.layout.griditem, viewGroup, false);
        return new ViewHolder(view);
    }

    /**
     * 加载数据
     * @param viewHolder
     * @param i
     */
    @Override
    public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {

        final JsonBean.MoviesBean moviesBean = list.get(i);
        Glide.with(context).load(moviesBean.getImageUrl()).into(viewHolder.imag);
        viewHolder.itemText.setText(moviesBean.getTitle());
        viewHolder.stars.setRating((float) (moviesBean.getRating().getAverage() / 2));
        viewHolder.itemText2.setText(String.valueOf(moviesBean.getRating().getAverage()));
//        Logger.v(String.valueOf((float) moviesBean.getRating().getAverage() / 2));
        //设置item点击事件
        viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //todo: 跳转详情页面
                Intent intent = new Intent(context,DetailsActivity.class);
                intent.putExtra("movies",  moviesBean);
                context.startActivity(intent);
            }
        });
    }

    /**
     * 获取item数量
     * @return
     */
    @Override
    public int getItemCount() {
        return list.size();
    }

    /**
     * 自定义ViewHolder
     */
    static class ViewHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.imag)
        ImageView imag;
        @BindView(R.id.item_text)
        TextView itemText;
        @BindView(R.id.stars)
        RatingBar stars;
        @BindView(R.id.item_text2)
        TextView itemText2;
        ViewHolder(@NonNull View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }
    }
}
LayoutManager 布局管理器
  

RecyclerView提供了三种布局管理器:

  • LinerLayoutManager 以垂直或者水平列表方式展示Item
  • GridLayoutManager 以网格方式展示Item
  • StaggeredGridLayoutManager 以瀑布流方式展示Item
LayoutManager常见API
    canScrollHorizontally();//能否横向滚动
    canScrollVertically();//能否纵向滚动
    scrollToPosition(int position);//滚动到指定位置

    setOrientation(int orientation);//设置滚动的方向
    getOrientation();//获取滚动方向

    findViewByPosition(int position);//获取指定位置的Item View
    findFirstCompletelyVisibleItemPosition();//获取第一个完全可见的Item位置
    findFirstVisibleItemPosition();//获取第一个可见Item的位置
    findLastCompletelyVisibleItemPosition();//获取最后一个完全可见的Item位置
    findLastVisibleItemPosition();//获取最后一个可见Item的位置

 

猜你喜欢

转载自www.cnblogs.com/conglingkaishi/p/10125997.html