在活动之间用以前的数据重新加载recyclerview

8iwquhpp  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(322)

我创建了一个有排行榜的应用程序。
排行榜由3个类别组成:排名靠前,分享最多,信息最多。

在每个类别(选项卡)中,都有一个recyclerview,它从每个类别中加载了25个结果 firestore .
所发生的是,每次用户打开这个活动,它读取75个文件,这几乎是我试图避免它。
是否有任何方法,当用户第一次启动活动时,它将加载这75个文档,但如果他在5分钟后启动活动,例如,它将只显示与以前相同的结果,而不从中读取75个文档 firestore 再一次?
每个recyclerview的加载方式如下:

RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager( getApplicationContext() );
rv_TopRank.setLayoutManager( mLayoutManager );
rv_TopRank.setItemAnimator( new DefaultItemAnimator() );

private void showTopRanked() {
    usersID.clear();
    usersName.clear();
    usersResult.clear();

    db.collectionGroup( "UserData" ).orderBy( "rank", Query.Direction.DESCENDING ).limit( AppConstants.LEADERBOARD_TO_LOAD ).get()
            .addOnSuccessListener( queryDocumentSnapshots -> {
                for (QueryDocumentSnapshot document : queryDocumentSnapshots) {
                    if (document != null) {
                        usersID.add( document.getId() );
                        usersName.add( document.getString( "username" ) );
                        usersResult.add( document.getDouble( "rank" ) );
                    }
                }
                leaderBoardAdapter = new LeaderBoardAdapter( usersID, usersName, usersResult, 0 );
                rv_TopRank.setAdapter( leaderBoardAdapter );
                leaderBoardAdapter.notifyDataSetChanged();
            } );
}

谢谢您

ruoxqz4g

ruoxqz4g1#

一种选择是使用android的共享首选项在本地保存数据,并且只在您认为必要时更新数据,而不是每次打开应用程序时更新数据。

smdnsysy

smdnsysy2#

您可以使用以下方法:
onCreate() 方法,从日历中读取日期并将其保存在 sharedPreferences 作为上次更新的日期,然后检查当前日期是否不等于上次更新的日期,然后从firebase进行查询。
像这样:

val sharedPref = getSharedPreferences("SharedPref", Context.MODE_PRIVATE)

val today = Calendar.getInstance().get(Calendar.DAY_OF_YEAR)
val lastUpdateDay = sharedPref.getInt("lastUpdateDay", 0)

if (today != lastUpdateDay) {
    //THE LOCAL DATA IS OLD SO IT NEEDS TO BE UPDATED FROM FIREBASE THEREFORE:

    //Query and show Firebase database data
    //Store the data locally (Either in a database or again in sharedPref)
    //and save `today` to sharedPref in the onSuccess() block like so:
    sharedPref.edit().putInt("lastUpdateDay", today).apply()
} else {
    //THE LOCAL DATA IS UP-TO-DATE SO NO NEED FOR A FIREBASE QUERY

    //Load the data you have stored locally the day before
}

对不起,代码在Kotlin。只是给你个主意。

相关问题