美文网首页
RecyclerView的使用

RecyclerView的使用

作者: 魔女小姐的猫 | 来源:发表于2020-03-23 08:14 被阅读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头和脚。

    相关文章

      网友评论

          本文标题:RecyclerView的使用

          本文链接:https://www.haomeiwen.com/subject/twkiyhtx.html