Java Android Firebase RecyclerView中的无限滚动在加载附加数据时跳转到第一项
我已经在我的RecyclerView上实现了无限滚动(加载更多)分页 我正在从Firebase实时数据库获取数据 但当我向上滚动以获取更多数据时,它会跳到recyclerview上的第一项 我试图更改startAt()值,但遇到了相同的问题 我试图在互联网上找到解决方案,但没有找到 以下是我的主要活动:--Java Android Firebase RecyclerView中的无限滚动在加载附加数据时跳转到第一项,java,android,firebase,firebase-realtime-database,android-recyclerview,Java,Android,Firebase,Firebase Realtime Database,Android Recyclerview,我已经在我的RecyclerView上实现了无限滚动(加载更多)分页 我正在从Firebase实时数据库获取数据 但当我向上滚动以获取更多数据时,它会跳到recyclerview上的第一项 我试图更改startAt()值,但遇到了相同的问题 我试图在互联网上找到解决方案,但没有找到 以下是我的主要活动:-- 公共类MainActivity扩展了AppCompatActivity{ 私人ArrayList咖啡; 私人咖啡适配器咖啡适配器; 私有上下文上下文=MainActivity.this;
公共类MainActivity扩展了AppCompatActivity{
私人ArrayList咖啡;
私人咖啡适配器咖啡适配器;
私有上下文上下文=MainActivity.this;
静态循环视图循环视图;
私人数据库参考;
网格布局经理;
int currentPage=0;
私有静态最终整数总计项目每个负载=4;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView=findViewById(R.id.mainRecyclerView);
recyclerView.setHasFixedSize(true);
manager=新的GridLayoutManager(这是2);
coffeeItems=新ArrayList();
recyclerView.setLayoutManager(管理器);
coffeeAdapter=新的coffeeAdapter(咖啡项目,此项);
recyclerView.setAdapter(咖啡适配器);
reference=FirebaseDatabase.getInstance().getReference();
recyclerView.addOnScrollListener(新EndlesRecycleronScrollListener(管理器){
@凌驾
public void onLoadMore(int当前页面){
loadMoreData();
}
});
init();
}
私有void init(){
参考。儿童(“图像”)
.limitToFirst(每次装载的物品总数)
.startAt(当前页面*每个加载的项目总数)
.orderByChild(“密钥id”)
.addValueEventListener(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
对于(DataSnapshot快照:DataSnapshot.getChildren()){
CoffeeItem CoffeeItem=新的CoffeeItem();
coffeeItem.setUrl(snapshot.child(“url”).getValue().toString());
coffeeItem.setTitle(snapshot.child(“title”).getValue().toString());
咖啡项目。添加(咖啡项目);
}
coffeeAdapter=新的coffeeAdapter(咖啡项目,上下文);
recyclerView.setAdapter(咖啡适配器);
coffeeAdapter.notifyDataSetChanged();
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
});
}
私有void loadMoreData(){
currentPage++;
init();
}
}
这里的主要问题是,每次尝试加载更多数据时,都会调用init()。在这种情况下,我建议您向您的RecyclerView适配器添加另一个方法,您可以在其中添加新闻加载项。基本上,您不应该在每次获取数据时都设置适配器。谢谢@ArbenMaloku
public class MainActivity extends AppCompatActivity {
private ArrayList<CoffeeItem> coffeeItems;
private CoffeeAdapter coffeeAdapter;
private Context context = MainActivity.this;
static RecyclerView recyclerView;
private DatabaseReference reference;
GridLayoutManager manager;
int currentPage = 0;
private static final int TOTAL_ITEM_EACH_LOAD = 4;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = findViewById(R.id.mainRecyclerView);
recyclerView.setHasFixedSize(true);
manager = new GridLayoutManager(this,2);
coffeeItems = new ArrayList<>();
recyclerView.setLayoutManager(manager);
coffeeAdapter = new CoffeeAdapter(coffeeItems, this);
recyclerView.setAdapter(coffeeAdapter);
reference = FirebaseDatabase.getInstance().getReference();
recyclerView.addOnScrollListener(new EndlessRecyclerOnScrollListener(manager) {
@Override
public void onLoadMore(int current_page) {
loadMoreData();
}
});
init();
}
private void init() {
reference.child("Images")
.limitToFirst(TOTAL_ITEM_EACH_LOAD)
.startAt(currentPage*TOTAL_ITEM_EACH_LOAD)
.orderByChild("key_id")
.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
CoffeeItem coffeeItem = new CoffeeItem();
coffeeItem.setUrl(snapshot.child("url").getValue().toString());
coffeeItem.setTitle(snapshot.child("title").getValue().toString());
coffeeItems.add(coffeeItem);
}
coffeeAdapter = new CoffeeAdapter(coffeeItems, context);
recyclerView.setAdapter(coffeeAdapter);
coffeeAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
private void loadMoreData(){
currentPage++;
init();
}
}