RecyclerView的使用

2020-03-23  本文已影响0人  魔女小姐的猫
  1. RecyclerView的基本介绍 :

RecyclerView是谷歌V7包下新增的控件,用来替代ListView的使用,在RecyclerView标准化了ViewHolder类似于ListView中convertView用来做视图缓. ,先来说说RecyclerView的优点就是,他可以通过设置LayoutManager来快速实现listview、gridview、瀑布流的效果,而且还可以设置横向和纵向显示,添加动画效果也非常简单(自带了ItemAnimation,可以设置加载和移除时的动画,方便做出各种动态浏览的效果),也是官方推荐使用的.以下是官方的说明:

  1. RecyclerView的使用步骤 :
  1. 添加依赖(注意版本)
    implementation 'com.android.support:recyclerview-v7:27.1.1'
  2. 创建布局(宽高必须充满)
    <android.support.v7.widget.RecyclerView
    android:id="@+id/rv"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    />
  3. 找控件
  4. 设置布局管理器
    LinearLayoutManager 线性布局
    GridLayoutManager 网格布局
    StaggeredGridLayoutManager 瀑布流布局
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());  
  1. 获取数据 (切换子线程方法)
  2. 创建适配器 (重写3个方法,通过接口回调实现点击事件)
//重写3个方法

public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        if (viewType == VIEW_TYPE_ONE) {
            View view = inflater.inflate(R.layout.banner_rv, null);
            return new ViewHolder1(view);
        } else {
            View view = inflater.inflate(R.layout.article_rv, null);
            return new ViewHolder2(view);
        }
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) {
        int itemViewType = holder.getItemViewType();
        if (itemViewType == VIEW_TYPE_ONE) {
            ArrayList<String> imgs = new ArrayList<>();
            for (int i = 0; i < bannerList.size(); i++) {
                imgs.add(bannerList.get(i).getImagePath());
            }
            ViewHolder1 holder1 = (ViewHolder1) holder;
            holder1.banner_rv
                    .setImages(imgs)
                    .setImageLoader(new ImageLoader() {
                        @Override
                        public void displayImage(Context context, Object path, ImageView imageView) {
                            Glide
                                    .with(context)
                                    .load(path)
                                    .into(imageView);
                        }
                    })
                    .start();
        } else {
            ViewHolder2 holder2 = (ViewHolder2) holder;
            holder2.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (onItemCliskListen != null) {
                        onItemCliskListen.setonItemClisckListen(position-1);
                    }
                }
            });
            holder2.tv_BFragment.setText(articleList.get(position - 1).getTitle());
        }
    }

    @Override
    public int getItemCount() {
        return articleList.size() + 1;
    }

    @Override
    public int getItemViewType(int position) {
        if (position == 0) {
            return VIEW_TYPE_ONE;
        } else {
            return VIEW_TYPE_TWO;
        }
    }

    class ViewHolder1 extends RecyclerView.ViewHolder {
        public Banner banner_rv;

        public ViewHolder1(View rootView) {
            super(rootView);
            this.banner_rv = (Banner) rootView.findViewById(R.id.banner_rv);
        }

    }

    class ViewHolder2 extends RecyclerView.ViewHolder {
        public ImageView iv_img;
        public TextView tv_BFragment;

        public ViewHolder2(View rootView) {
            super(rootView);
            this.iv_img = (ImageView) rootView.findViewById(R.id.iv_img);
            this.tv_BFragment = (TextView) rootView.findViewById(R.id.tv_BFragment);
        }

    }
//通过接口回调实现点击事件

//1.  定义内部类
    public interface onItemCliskListen{
        void setonItemClisckListen(int position);
    }
//2.  提出该接口对应类型的变量
     private onItemCliskListen onItemCliskListen;
      //并设置set方法
      public void setOnItemCliskListen(RvAdapter.onItemCliskListen onItemCliskListen) {
        this.onItemCliskListen = onItemCliskListen;
      }
//3.  在onBindViewHolder中使用Holder 设置点击事件
       holder2.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
               public void onClick(View v) {
                     //变量调用自己的方法把position传出去
                    if (onItemCliskListen != null) {
                        onItemCliskListen.setonItemClisckListen(position-1);
                    }
                }
          });
4. 在Activity中使用Adapter调用他的内部类的set方法即可
       rvAdapter.setOnItemCliskListen(new RvAdapter.onItemCliskListen() {
            @Override
            public void setonItemClisckListen(int position) {
          //跳转到网网址  
                startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(articleList.get(position).getLink())));
            }
        });
  1. 设置适配器
  1. RecyclerView 滑动监听 (加载更多数据)
mRecyclerView.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                //scrollState 有三种类型
                //1. SCROLL_STATE_IDLE 手指未触摸屏幕,且屏幕静止
                //2.SCROLL_STATE_TOUCH_SCROLL 手指未离开屏幕滑动
                //3.SCROLL_STATE_FLING 手指使劲滑动屏幕,然后手指离开屏幕,屏幕仍在滚动
                switch (scrollState){
                    case SCROLL_STATE_IDLE:
                        if (mIsBottom){
                            addMore();
                            mIsBottom = false;
                        }
                        break;
                }
     }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {               //Log.d(TAG,"firstVisibleItem:"+firstVisibleItem+",visibleItemCount:"+visibleItemCount+",totalItemCount:"+totalItemCount);
                //firstVisibleItem,可见的第一个条目下标
                //visibleItemCount ,可见条目数量
                //totalItemCount 条目总个数
                if (firstVisibleItem+visibleItemCount == totalItemCount && totalItemCount>0){
                    mIsBottom = true;
                }else{
                    mIsBottom = false;
                }
            }
        });
    }

多布局

  1. RecyclerView多布局一:list+banner
    ① RecyclerView基本使用
    ②定义类型常量
    ③重写方法getItemViewType()根据位置返回不同类型
    ④重写oncreateViewHolder()根据不同类型加载不同的布局
    ⑤重写onBindViewHolder()根据不用类型加载不同数据

    注意
    ①获取条目总数:list.size()+1
    ②onBindViewHolder:获取别表条目数据的时候,position-1

  2. RecyclerView多布局二:奇数位置左图右文字+偶数位置左文字右图片
    ① RecyclerView基本使用(看6)
    ②定义类型常量
    ③重写方法getItemViewType()根据位置返回不同类型
    ④重写oncreateViewHolder()根据不同类型加载不同的布局
    ⑤重写onBindViewHolder()根据不用类型加载不同数据

  3. RecyclerView添加刷新
    ①添加依赖
    ②在布局中添加刷新的控件并找控件
    ③给刷新控件添加加载更多、下拉刷细腻添加监听,监听中写具 体代码
    ④刷新完毕列表,关闭SmartRefreshLayout头和脚。

上一篇下一篇

猜你喜欢

热点阅读