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中设置了错误的值。