我从 Paging 2 迁移到 Paging 3 库,现在我使用它PagingSource从服务器加载数据页面。但我很难理解getRefreshKey必须在那里重写的方法。我找到了一些代码示例,如何根据用于获取后续页面的密钥来实现它,但我仍然不明白。基于这些示例,我编写了以下代码:
override fun getRefreshKey(state: PagingState<Pair<String, String>, User>): Pair<String, String>? {
return state.anchorPosition?.let { anchorPosition ->
state.closestPageToPosition(anchorPosition)?.prevKey
}
}
Run Code Online (Sandbox Code Playgroud)
但如果我使它始终返回 null,它不会改变任何事情:
override fun getRefreshKey(state: PagingState<Pair<String, String>, User>): Pair<String, String>? = null
Run Code Online (Sandbox Code Playgroud)
那么我为什么不能选择最简单的解决方案呢?还是有我没有看到的用例?
我正在尝试实现如图所示的布局。

所以我希望在用户滚动到某个点后有两个固定在屏幕顶部的视图。其他视图应该折叠起来,直到完全隐藏为止(视图 3 除外,它基本上是布局的主视图。到目前为止,我已经尝试了几种方法。其中一种比较
有效,是将折叠工具栏与可固定视图 1 和Pinnable View 2 锚定到其他视图(我附上了代码片段,这样你就知道我实现了什么)。这种方法的问题是,因为这些可固定视图不在nestedScrollView内部,所以当用户使用时不可能滚动从这两个视图开始滚动,
所以我的问题是,使用我当前的方法是否可以达到预期的效果,或者是否有其他方法可以做到这一点?
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/app_bar_layout_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null">
<com.google.android.material.appbar.CollapsingToolbarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
app:layout_scrollFlags="scroll|exitUntilCollapsed|snap">
<View
android:id="@+id/view_1"
android:layout_width="match_parent"
android:layout_marginBottom="32dp"
android:layout_height="200dp"
android:background="#0071BD"
app:layout_collapseMode="parallax">
</View>
</com.google.android.material.appbar.CollapsingToolbarLayout>
</com.google.android.material.appbar.AppBarLayout>
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
android:layout_marginTop="32dp"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".ScrollingActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<View
android:id="@+id/view_2"
android:layout_width="wrap_content"
android:background="#5495BD"
android:layout_height="300dp"/>
<View
android:id="@+id/pinnable_view_2_anchor_view"
android:layout_width="match_parent"
android:layout_height="41dp"
android:background="@null" />
<View
android:id="@+id/view_3"
android:layout_width="match_parent"
android:background="#57B1BC"
android:layout_height="1000dp" />
</LinearLayout>
</androidx.core.widget.NestedScrollView>
<View
android:id="@+id/pinnable_view_1"
android:layout_width="match_parent"
android:layout_height="64dp"
android:background="#00015E"
android:nestedScrollingEnabled="true"
app:layout_anchor="@id/app_bar_layout_view"
app:layout_anchorGravity="bottom">
</View>
<View …Run Code Online (Sandbox Code Playgroud) android android-layout android-collapsingtoolbarlayout android-nestedscrollview
在我的应用程序中,用户可以在每个组合中使用多个过滤器来过滤他们的数据(仅应用一个、多个或不应用)。
在此之前,我只有一个过滤器,所以每次应用它时,我都在切换 DAO 方法。现在我有 6 个过滤器,所以有几十种组合,因此为每个组合创建一个方法是不可能的。我也不能大量修改我的数据库,因为它已经可供用户使用。
我当前的代码如下所示:
@Query("SELECT id, name, date FROM UserData")
fun getAll(): DataSource.Factory<Int, UserItem> //no filters
@Query("SELECT id, name, date FROM UserData WHERE name LIKE '%' || :search || '%'")
fun getAllFiltered(query: String): DataSource.Factory<Int, UserItem> //one filter applied
Run Code Online (Sandbox Code Playgroud)
有没有办法修改查询,以便所有过滤器组合都有一种方法?
更新:
这是我的数据类,我想过滤哪些实例:
@Entity(tableName = "UserItem")
data class UserItem(
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "id")
val id: Long? = null,
@ColumnInfo(name = "created_at")
val createdAt: Date,
@ColumnInfo(name = "is_uploaded")
val isUploaded: Boolean,
@ColumnInfo(name = "name")
val name: String,
@ColumnInfo(name …Run Code Online (Sandbox Code Playgroud) 目前我的代码看起来像这样我有一个ViewModel调用存储库进行一些后台计算并返回结果的代码。
ViewModel 函数运行,viewModelScope.launch(Dispatchers.IO)然后存储库之一是一个suspend函数。
我是否必须使用 returnwithContext{}来确保一切都按顺序完成?我查了一下,确实是连续的,但在文档中我发现它不一定是?
android coroutine kotlin android-viewmodel kotlin-coroutines
我找不到有关如何使用 AWS 的 Amplify Android 库刷新访问令牌的信息。
在文档和一些论坛上,有人建议这一切都会自动发生。但就我而言,事实并非如此。
在应用程序中,我使用 Amplify Auth 进行用户身份验证,还使用 Amplify Storage 和 Amplify Predictions。
为了查询我的数据库,我使用DynamoDBMapper适用于 Android 的 AWS 开发工具包。
到目前为止,我已尝试通过以下方式强制刷新令牌:
auth.currentUserAWSMovileClient.getInstance().tokensAWSMobileClient.getInstance().currentUserState()Amplify.Auth.fetchAuthSession()前三个都不起作用。fetchAuthSession(...)是我现在使用的技术,但它是异步的,需要一些时间才能产生结果。我必须在我的splash activity. 否则,如果它是异步的并且存在对数据库的请求,该请求取决于其结果,则数据库调用将导致NotAuthorizedException.
另外,刷新令牌可以设置为 10 年左右,所以目前这不是问题。问题是旧访问令牌过期后不会创建新的访问令牌,并且我无法执行任何经过身份验证的用户操作。
有没有办法快速检查令牌是否有效——如果无效,则刷新它们?
android amazon-web-services amazon-cognito aws-amplify aws-sdk-android
我正在使用 Paging 3PagingDataAdapter根据给定的查询搜索数据库。每次提交新查询时,我都会调用refresh()适配器上的方法。问题是在加载新数据之前,旧数据仍然存在。
有没有办法从列表中删除所有项目,以便在加载过程中不存在任何项目?此外,我使用ConcatAdapter来附加页眉和页脚以指示加载,因此我的目标是仅在加载数据/提交新查询时显示进度指示器。
更新:
我设法让它工作的唯一方法是调用,adapter.submitData(PagingData.empty())然后是pagingSource.invalidate(). 我不喜欢这个解决方案,因为访问invalidate()存储库层中可用的方法并不容易,我不得不在ViewModel. 有没有更优雅的方法来实现这一目标?我不认为这是一种方法,因为在加载期间刷新列表和删除项目的用例非常普遍,我认为在 Paging 3 库开发过程中已将其考虑在内。
我有一个PreviewView占据整个屏幕但工具栏除外。相机的预览效果很好,但是当我拍摄图像时,纵横比完全不同。
我想在成功捕获后向用户显示图像,因此它的大小与 相同,PreviewView因此我不必裁剪或拉伸它。
是否可以在每个设备上更改纵横比,它是它的大小PreviewView还是我必须将其设置为固定值?
android ×7
kotlin ×5
android-collapsingtoolbarlayout ×1
android-room ×1
aws-amplify ×1
coroutine ×1