ScrollView上拉加载实现

本文介绍如何解决ScrollView与RecyclerView嵌套时的滑动冲突问题,并提供了一种通过监听ScrollView滑动状态来实现上拉加载更多的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于之前的一个电商项目,布局上ScrollView嵌套一个RecycleView比较方便实现,但是由于嵌套的冲突,所以需要自定义一个layouManager,才能显示全部recycleView。但是recycleView上拉冲突就出问题了。
所以对ScrollView设置一个监听器实现。
此处用的是Adapter是用的明宇大大的Brvah,链接奉上:
http://www.jianshu.com/p/b343fcff51b0

直接贴代码:

package com.cdmhzx.gankiorx.fragment;

import android.os.Bundle;
import android.support.v4.widget.NestedScrollView;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ScrollView;

import com.cdmhzx.gankiorx.Presenter.HomePresenter;
import com.cdmhzx.gankiorx.Presenter.ScrollPresenter;
import com.cdmhzx.gankiorx.R;
import com.cdmhzx.gankiorx.View.IScrollView;
import com.cdmhzx.gankiorx.View.MyGridLayoumanager;
import com.cdmhzx.gankiorx.bean.AllBean;

import java.util.ArrayList;
import java.util.List;

import butterknife.BindView;

/**
 * Created by lizz on 2017/6/29.
 */

public class ScrollFragment extends BaseLazyFragment implements IScrollView{

    @BindView(R.id.scrollView)
    NestedScrollView mScrollView;
    @BindView(R.id.rv)
    RecyclerView mRecyclerView;
    @BindView(R.id.srl)
    SwipeRefreshLayout mSwipeRefreshLayout;

    private List<AllBean.ResultsBean> mResultsBeen;

    ScrollPresenter mScrollPresenter;
    private int mCurrentPage = 1;
    private HomeAdapter mAdapter;
    private boolean isLoading = false;

    @Override
    protected void lazeLoadData() {
        getList(10,mCurrentPage);
        Log.e("DDD","加载数据开始");
    }

    @Override
    protected void createFragment(Bundle savedInstanceState) {

    }

    @Override
    protected void initView() {
        mScrollPresenter = new ScrollPresenter();
        mScrollPresenter.attachView(this);
        if (mResultsBeen==null)
            mResultsBeen = new ArrayList<>();
        mRecyclerView.setLayoutManager(new MyGridLayoumanager(mActivity,2));
        mAdapter = new HomeAdapter(R.layout.item_home, mResultsBeen, HomeAdapter.TYPE1);
        mRecyclerView.setAdapter(mAdapter);
        mRecyclerView.setNestedScrollingEnabled(false);

        mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                mCurrentPage = 1;
                getList(10,mCurrentPage);
            }
        });


        mScrollView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                switch (motionEvent.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        break;
                    case MotionEvent.ACTION_MOVE:
                        // getScrollY()是滚动条距离页面顶端的距离
                        // getMeasuredHeight()是屏幕顶端距离页面顶端的距离
                        // getHeight()是屏幕高度
                        int y = mScrollView.getScrollY();
                        if (isLoading){
                            return false;
                        }

                        if (y<=0){
                        /**顶部*/
                        }else if (mScrollView.getChildAt(0).getMeasuredHeight()<=y+mScrollView.getHeight()){
                            if (!isLoading){
                                getList(10,mCurrentPage);
                                isLoading = true;
                            }
                        }
                        break;
                    case MotionEvent.ACTION_UP:
                        break;
                }
                return false;
            }
        });
    }

    @Override
    protected int bindLayout() {
        return R.layout.fragment_scroll;
    }

    @Override
    public void showLoadingDialog() {

    }

    @Override
    public void cancelLoadingDialog() {

    }

    @Override
    public void showErrorMsg(String errorMsg) {

    }

    @Override
    public void getList(int pageSize, int currentPage) {
        mScrollPresenter.getList(pageSize,currentPage);
        mCurrentPage++;
    }

    @Override
    public void onRefreshData(List<AllBean.ResultsBean> resultsBeen) {
        Log.e("DDD","刷新数据");
        mResultsBeen.clear();
        mResultsBeen.addAll(resultsBeen);
        mAdapter.setNewData(mResultsBeen);
        Log.e("DDD",mResultsBeen.size()+"");
        mSwipeRefreshLayout.setRefreshing(false);
    }

    @Override
    public void onLoadMoreData(List<AllBean.ResultsBean> resultsBeen) {
        Log.e("DDD","加载更多数据");
        mResultsBeen.addAll(resultsBeen);
        mAdapter.notifyDataSetChanged();
        isLoading = false;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值