Java Android Firebase RecyclerView中的无限滚动在加载附加数据时跳转到第一项

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;

我已经在我的RecyclerView上实现了无限滚动(加载更多)分页

我正在从Firebase实时数据库获取数据

但当我向上滚动以获取更多数据时,它会跳到recyclerview上的第一项

我试图更改startAt()值,但遇到了相同的问题

我试图在互联网上找到解决方案,但没有找到

以下是我的主要活动:--


公共类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();
    }
}