Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java RecyclerView.OnScrollListener出现问题_Java_Android_Android Recyclerview - Fatal编程技术网

Java RecyclerView.OnScrollListener出现问题

Java RecyclerView.OnScrollListener出现问题,java,android,android-recyclerview,Java,Android,Android Recyclerview,向相反方向滚动不起作用 我理解,我只是错误地通过演示者重新更新视图中的数据,并且它们必须全部可用回收视图 加载下一部分数据时,RecyclerView没有时间显示最后的元素并立即加载新部分 我做错了什么 public class HomeActivity extends AppCompatActivity implements HomeView{ @BindView(R.id.recyclerView) RecyclerView recyclerView; Home

向相反方向滚动不起作用

我理解,我只是错误地通过
演示者
重新更新
视图
中的数据,并且它们必须全部可用
回收视图

加载下一部分数据时,
RecyclerView
没有时间显示最后的元素并立即加载新部分

我做错了什么

public class HomeActivity extends AppCompatActivity implements HomeView{


    @BindView(R.id.recyclerView)
    RecyclerView recyclerView;

    HomePresenter presenter;

    private static int offset;

    private static boolean isLoading;

    public static void setIsLoading(boolean isLoading) {
        HomeActivity.isLoading = isLoading;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
        ButterKnife.bind(this);

        presenter = new HomePresenter(this);
        presenter.getData(offset);
        offset = 0;
        isLoading = true;
    }


    @Override
    public void setData(List<PokemonData.Pokemon> pokemons) {
        RecyclerViewHomeAdapter homeAdapter = new RecyclerViewHomeAdapter(pokemons, this);
        recyclerView.setAdapter(homeAdapter);
        GridLayoutManager layoutManager = new GridLayoutManager(this, 2, RecyclerView.VERTICAL, false);
        recyclerView.setLayoutManager(layoutManager);


        recyclerView.addOnScrollListener(new RecyclerViewOnScroll() {
            @Override
            protected void loadMore() {

                if (isLoading) {
                    isLoading = false;
                    offset+=30;
                    presenter.getData(offset);
                }
            }
        });
        homeAdapter.notifyDataSetChanged();
试试这个

private Boolean mIsMoreLoading = false;
private Boolean mIsLastPage = false;


 @Override
    public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);

        if ( dy > 0) {

            GridLayoutManager gridLayoutManager = (GridLayoutManager) recyclerView.getLayoutManager();
            int visibleItemCount = gridLayoutManager.getChildCount();
            int totalItemCount = gridLayoutManager.getItemCount();
            int firstVisibleItems = gridLayoutManager.findFirstVisibleItemPosition();

            if ((!mIsMoreLoading) && (!mIsLastPage)) {
                    if ((firstVisibleItems + visibleItemCount) >= totalItemCount
                            && firstVisibleItems >= 0
                            && totalItemCount >= 20 //  the items in one request) {
                        loadMore()
                        mIsMoreLoading = true
                    }
                }
        }
    }
试试这个

private Boolean mIsMoreLoading = false;
private Boolean mIsLastPage = false;


 @Override
    public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);

        if ( dy > 0) {

            GridLayoutManager gridLayoutManager = (GridLayoutManager) recyclerView.getLayoutManager();
            int visibleItemCount = gridLayoutManager.getChildCount();
            int totalItemCount = gridLayoutManager.getItemCount();
            int firstVisibleItems = gridLayoutManager.findFirstVisibleItemPosition();

            if ((!mIsMoreLoading) && (!mIsLastPage)) {
                    if ((firstVisibleItems + visibleItemCount) >= totalItemCount
                            && firstVisibleItems >= 0
                            && totalItemCount >= 20 //  the items in one request) {
                        loadMore()
                        mIsMoreLoading = true
                    }
                }
        }
    }

我有相同类型的recyclerview滚动,所以我设置了此选项,您可以根据需要进行尝试

//Pagination
private int startPosition = 0;
private boolean isLoading = true;

//recycler view scroll listener for pagination
    rvCoupons.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            if (dy > 0) {
                int visibleItemCount = mLayoutManager.getChildCount();
                int totalItemCount = mLayoutManager.getItemCount();
                int pastVisibleItem = mLayoutManager.findFirstVisibleItemPosition();
                if (isLoading) {
                    if ((visibleItemCount + pastVisibleItem) >= totalItemCount) {
                        isLoading = false;
                        filterDataRequest.setStart(startPosition);
                        viewModel.callSearchCouponsApi(true, filterDataRequest);
                    }
                }
            }
        }
    });

//On Api Success
 if (response != null && !response.getData().isEmpty()) {
        if (startPosition == 0)
            mCouponList.clear();
        if (response.getData() != null && !response.getData().isEmpty()) {
            startPosition += response.getData().size();
            mCouponList.addAll(response.getData());
            if (mSearchCouponAdapter != null) mSearchCouponAdapter.notifyDataSetChanged();
            isLoading = true;
        } else {
            isLoading = false;
        }
    }

我有相同类型的recyclerview滚动,所以我设置了此选项,您可以根据需要进行尝试

//Pagination
private int startPosition = 0;
private boolean isLoading = true;

//recycler view scroll listener for pagination
    rvCoupons.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            if (dy > 0) {
                int visibleItemCount = mLayoutManager.getChildCount();
                int totalItemCount = mLayoutManager.getItemCount();
                int pastVisibleItem = mLayoutManager.findFirstVisibleItemPosition();
                if (isLoading) {
                    if ((visibleItemCount + pastVisibleItem) >= totalItemCount) {
                        isLoading = false;
                        filterDataRequest.setStart(startPosition);
                        viewModel.callSearchCouponsApi(true, filterDataRequest);
                    }
                }
            }
        }
    });

//On Api Success
 if (response != null && !response.getData().isEmpty()) {
        if (startPosition == 0)
            mCouponList.clear();
        if (response.getData() != null && !response.getData().isEmpty()) {
            startPosition += response.getData().size();
            mCouponList.addAll(response.getData());
            if (mSearchCouponAdapter != null) mSearchCouponAdapter.notifyDataSetChanged();
            isLoading = true;
        } else {
            isLoading = false;
        }
    }

如果解决方案对某人有所帮助,则有必要从setData方法中删除所有初始化

public class HomeActivity extends AppCompatActivity implements HomeView{


@BindView(R.id.recyclerView)
RecyclerView recyclerView;
@BindView(R.id.btn_refresh)
FloatingActionButton btn_refresh;

HomePresenter presenter;
private List<PokemonData.Pokemon> items = new ArrayList<>();

private static int offset;

private static boolean isLoading;
private RecyclerViewHomeAdapter homeAdapter;

public static void setIsLoading(boolean isLoading) {
    HomeActivity.isLoading = isLoading;
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);
    ButterKnife.bind(this);
    presenter = new HomePresenter(this);
    presenter.getData(offset);
    offset = 0;
    isLoading = true;

    homeAdapter = new RecyclerViewHomeAdapter(items, this);

    recyclerView.setAdapter(homeAdapter);
    GridLayoutManager layoutManager = new GridLayoutManager(this, 2, RecyclerView.VERTICAL, false);

    recyclerView.setLayoutManager(layoutManager);
    recyclerView.addOnScrollListener(new RecyclerViewOnScroll() {
        @Override
        protected void loadMore() {

            if (isLoading) {
                offset+=30;
                presenter.getData(offset);
                isLoading = false;
                homeAdapter.setPokemonList(items);
            }
        }
    });

}

@Override
public void setData(List<PokemonData.Pokemon> pokemons) {
    items.addAll(pokemons);
    homeAdapter.setPokemonList(items)

}}
公共类HomeActivity扩展AppCompatActivity实现HomeView{
@BindView(R.id.recyclerView)
回收视图回收视图;
@BindView(R.id.btn\u刷新)
浮动操作按钮btn_刷新;
家庭演讲者;
私有列表项=新的ArrayList();
私有静态整数偏移;
私有静态布尔孤岛加载;
私人回收服务WhomeAdapter homeAdapter;
公共静态无效设置isLoading(布尔isLoading){
HomeActivity.isLoading=isLoading;
}
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
把(这个)绑起来;
演示者=新的家庭演示者(此);
presenter.getData(偏移量);
偏移量=0;
isLoading=true;
homeAdapter=新的RecycleServiceWhomeAdapter(项,此项);
recyclerView.setAdapter(homeAdapter);
GridLayoutManager layoutManager=新的GridLayoutManager(this,2,RecyclerView.VERTICAL,false);
recyclerView.setLayoutManager(layoutManager);
addOnScrollListener(新的RecycleServiceWindowScroll()){
@凌驾
受保护的void loadMore(){
如果(孤岛加载){
偏移量+=30;
presenter.getData(偏移量);
isLoading=false;
homeAdapter.setPokemonList(项目);
}
}
});
}
@凌驾
公共void setData(列出口袋妖怪){
items.addAll(口袋妖怪);
homeAdapter.setPokemonList(项目)
}}

如果解决方案对某人有所帮助,则必须从setData方法中删除所有初始化

public class HomeActivity extends AppCompatActivity implements HomeView{


@BindView(R.id.recyclerView)
RecyclerView recyclerView;
@BindView(R.id.btn_refresh)
FloatingActionButton btn_refresh;

HomePresenter presenter;
private List<PokemonData.Pokemon> items = new ArrayList<>();

private static int offset;

private static boolean isLoading;
private RecyclerViewHomeAdapter homeAdapter;

public static void setIsLoading(boolean isLoading) {
    HomeActivity.isLoading = isLoading;
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);
    ButterKnife.bind(this);
    presenter = new HomePresenter(this);
    presenter.getData(offset);
    offset = 0;
    isLoading = true;

    homeAdapter = new RecyclerViewHomeAdapter(items, this);

    recyclerView.setAdapter(homeAdapter);
    GridLayoutManager layoutManager = new GridLayoutManager(this, 2, RecyclerView.VERTICAL, false);

    recyclerView.setLayoutManager(layoutManager);
    recyclerView.addOnScrollListener(new RecyclerViewOnScroll() {
        @Override
        protected void loadMore() {

            if (isLoading) {
                offset+=30;
                presenter.getData(offset);
                isLoading = false;
                homeAdapter.setPokemonList(items);
            }
        }
    });

}

@Override
public void setData(List<PokemonData.Pokemon> pokemons) {
    items.addAll(pokemons);
    homeAdapter.setPokemonList(items)

}}
公共类HomeActivity扩展AppCompatActivity实现HomeView{
@BindView(R.id.recyclerView)
回收视图回收视图;
@BindView(R.id.btn\u刷新)
浮动操作按钮btn_刷新;
家庭演讲者;
私有列表项=新的ArrayList();
私有静态整数偏移;
私有静态布尔孤岛加载;
私人回收服务WhomeAdapter homeAdapter;
公共静态无效设置isLoading(布尔isLoading){
HomeActivity.isLoading=isLoading;
}
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
把(这个)绑起来;
演示者=新的家庭演示者(此);
presenter.getData(偏移量);
偏移量=0;
isLoading=true;
homeAdapter=新的RecycleServiceWhomeAdapter(项,此项);
recyclerView.setAdapter(homeAdapter);
GridLayoutManager layoutManager=新的GridLayoutManager(this,2,RecyclerView.VERTICAL,false);
recyclerView.setLayoutManager(layoutManager);
addOnScrollListener(新的RecycleServiceWindowScroll()){
@凌驾
受保护的void loadMore(){
如果(孤岛加载){
偏移量+=30;
presenter.getData(偏移量);
isLoading=false;
homeAdapter.setPokemonList(项目);
}
}
});
}
@凌驾
公共void setData(列出口袋妖怪){
items.addAll(口袋妖怪);
homeAdapter.setPokemonList(项目)
}}

loadMore
中,您是否应该说
如果不isLoading
,然后将其设置为true并加载more,然后演示者应将
isLoading
设置为false。这样,当它加载时,你告诉它加载更多。按照你写的,效果与问题相同。也许我通过set方法在Presentor中设置了错误的值。在
loadMore
中,您是否应该说
如果不isLoading
,然后将其设置为true并加载more,然后Presenter应将
isLoading
设置为false。这样,当它加载时,你告诉它加载更多。按照你写的,效果与问题相同。也许我通过set方法在Presentor中设置了错误的值。