高级UIAndroid应用开发那些事

SwipeRefreshLayout的下拉刷新、上拉加载

2019-10-22  本文已影响0人  zhangwenhao

SwipeRefreshLayout的下拉刷新、上拉加载


前言

上拉加载

1. 明确子项 Item 的类型,定义几个 int 类型的常量作为 Item 类型

    private static final int TYPE_BANNER = 0; //第一个Banner布局
    private static final int TYPE_FUNCTION = 1; //第二个功能表布局
    private static final int TYPE_SELLERS = 2; //第三个热销榜布局
    private static final int TYPE_FRUIT = 3; //第四个水果Item布局
    private static final int TYPE_FOOTER = 4; //第五个底部加载布局

2. 重写 getItemViewType() 方法

// 根据你想要的放置的 item 位置来返回不同的类型
    @Override
    public int getItemViewType(int position) {
        if (position == 0) {
            return TYPE_BANNER;
        }else if (position == 1) {
            return TYPE_FUNCTION;
        }else if (position == 2) {
            return TYPE_SELLERS;
        }else if (position + 1 == getItemCount()) {
            return TYPE_FOOTER;
        }else {
            return TYPE_FRUIT;
        }
    }

3. 根据 Item 的类型,来定义对应的 ViewHolder

// 后续操作需要实例的
    class BannerViewHolder extends RecyclerView.ViewHolder {

        ViewPager viewPager;
        LinearLayout linearLayout;

        public BannerViewHolder(@NonNull View itemView) {
            super(itemView);
            viewPager = itemView.findViewById(R.id.home_view_pager);
            linearLayout = itemView.findViewById(R.id.home_ll_indicator);
        }
    }
    
//后续操作不需要实例的
    class FunctionViewHolder extends RecyclerView.ViewHolder {

        public FunctionViewHolder(@NonNull View itemView) {
            super(itemView);
        }
    }

4. 在 onCreateViewHolder() 方法中进行判断 item 类型,来加载不同的布局

// 根据不同的类型,加载对应的 View,并返回对应的 ViewHolder

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {

        if (i == TYPE_BANNER) {
            View view = LayoutInflater.from(context).inflate(R.layout.fragment_home_banner,
                    viewGroup,false);
            return new BannerViewHolder(view);
        }else if (i == TYPE_FUNCTION) {
            View view = LayoutInflater.from(context).inflate(R.layout.fragment_home_function
                    viewGroup,false);
            return new FunctionViewHolder(view);
        }
        
        ···
        
        }else if (i == TYPE_FOOTER) {
            View view = LayoutInflater.from(context).inflate(R.layout.fragment_home_footer,
                    viewGroup,false);
            return new FooterViewHolder(view);
        }
        
        //当 else if 语句的条件都不满足的时候,该方法就无返回值了,所以这里加一个返回值
        //不过应该是不会用到的
        return null;
    }

5. 定义滑动变量、滑动状态常量,并提供相应的 set 方法

//滑动状态常量
public final int STATE_LOADING = 0;
public final int STATE_FINISH  = 1;

//滑动状态变量
private int state = STATE_LOADING;

//相应的改变滑动状态的 set方法
public void setLoadState(int state) {
    this.state = state;
}

6. 在 onBindViewHolder() 方法中根据不同的 ViewHolder 来对相应的布局实例进行操作

其实对于上拉加载这个功能来说,这一步就是上拉加载 UI 的具体展示

 @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
        
        // 此处省略部分代码,下面的是重点
        ···
        
        }else if (viewHolder instanceof FooterViewHolder) {
        //根据当前的滑动状态,对应的是实现 进度条的显示、隐藏等
            FooterViewHolder footerViewHolder = (FooterViewHolder)viewHolder;
            switch (state) {
                case STATE_LOADING:
                    footerViewHolder.progressBar.setVisibility(View.VISIBLE);
                    footerViewHolder.textView.setText("正在加载...");
                    break;
                case STATE_FINISH:
                    footerViewHolder.progressBar.setVisibility(View.GONE);
                    footerViewHolder.textView.setText("我也是有底线的哦~");
                default:
                    break;
            }

        }
    }

7. 关于加载的数据

需要进行处理的内容

//下面使用的是本地的数据,也控制了只能加载两次,超过两次将不再进行加载
private void getData() {
    if (loadCount <= 2){
        for (int i = 0; i < 2; i++) {
            urlList.add(String.valueOf(i));
        }
        Log.d("TAG","getData执行");
        //加载次数加一
        loadCount++;
    }
}

8. 最后一步,对 RecyclerView 的滑动监听进行处理

//使用的是本地数据
    recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {

            if (newState == RecyclerView.SCROLL_STATE_IDLE) {
            //下面的manger是RecyclerView的主布局线性布局的实例,通过new出来的,需要传入几个参数
                int lastItemPosition = manager.findLastCompletelyVisibleItemPosition();
                int itemCount = manager.getItemCount();
                if (itemCount - 1 == lastItemPosition) {
                    new Handler().postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            Log.d("TAG","onSrcolled()方法执行");
                            getData();
                            if (loadCount <= 2) {
                                adapter.setLoadState(adapter.STATE_LOADING);
                            }else {
                                adapter.setLoadState(adapter.STATE_FINISH);
                            }
                            adapter.notifyDataSetChanged();
                        }
                    },1000);
                }
            }
        }
 
        @Override
        public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView,dx,dy);
        }
    });

下拉刷新

//这是项目中的代码,不要这么死板,看懂就行啦
    private void initSwipeRefresh() {

        refreshLayout = viewHome.findViewById(R.id.home_swipe_refresh);
        
        //设置 加载的那个圈圈的颜色,最多四种,这个颜色是依次加载的
        refreshLayout.setColorSchemeResources(android.R.color.holo_blue_light,
                android.R.color.holo_red_light, android.R.color.holo_orange_light,
                android.R.color.holo_green_light);
        //设置刷新监听
        refreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
            //这个方法就是下拉刷新的时候会触发的,清楚原有数据,重新获取数据,通知Adapter更新数据
                urlList.clear();
                loadCount = 0;
                getData();
                adapter.notifyDataSetChanged();
                refreshLayout.setRefreshing(false);
            }
        });
    }
上一篇下一篇

猜你喜欢

热点阅读