小编bal*_*ekg的帖子

理解PagingSource的getRefreshKey

我从 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)

那么我为什么不能选择最简单的解决方案呢?还是有我没有看到的用例?

android kotlin android-paging android-paging-3

20
推荐指数
2
解决办法
7568
查看次数

如何实现具有两个固定视图的“双”折叠工具栏

我正在尝试实现如图所示的布局。
这就是我希望它工作的方式
所以我希望在用户滚动到某个点后有两个固定在屏幕顶部的视图。其他视图应该折叠起来,直到完全隐藏为止(视图 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

7
推荐指数
1
解决办法
2090
查看次数

带有多个非强制性过滤器的 Room DAO

在我的应用程序中,用户可以在每个组合中使用多个过滤器来过滤他们的数据(仅应用一个、多个或不应用)。

在此之前,我只有一个过滤器,所以每次应用它时,我都在切换 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)

android kotlin android-sqlite android-room

7
推荐指数
1
解决办法
219
查看次数

什么时候使用 withContext?

目前我的代码看起来像这样我有一个ViewModel调用存储库进行一些后台计算并返回结果的代码。
ViewModel 函数运行,viewModelScope.launch(Dispatchers.IO)然后存储库之一是一个suspend函数。
我是否必须使用 returnwithContext{}来确保一切都按顺序完成?我查了一下,确实是连续的,但在文档中我发现它不一定是?

android coroutine kotlin android-viewmodel kotlin-coroutines

6
推荐指数
1
解决办法
1810
查看次数

如何使用 AWS Amplify Android 强制刷新身份验证令牌?

我找不到有关如何使用 AWS 的 Amplify Android 库刷新访问令牌的信息。

在文档和一些论坛上,有人建议这一切都会自动发生。但就我而言,事实并非如此。

在应用程序中,我使用 Amplify Auth 进行用户身份验证,还使用 ​​Amplify Storage 和 Amplify Predictions。

为了查询我的数据库,我使用DynamoDBMapper适用于 Android 的 AWS 开发工具包。

到目前为止,我已尝试通过以下方式强制刷新令牌:

  1. auth.currentUser
  2. AWSMovileClient.getInstance().tokens
  3. AWSMobileClient.getInstance().currentUserState()
  4. Amplify.Auth.fetchAuthSession()

前三个都不起作用。fetchAuthSession(...)是我现在使用的技术,但它是异步的,需要一些时间才能产生结果。我必须在我的splash activity. 否则,如果它是异步的并且存在对数据库的请求,该请求取决于其结果,则数据库调用将导致NotAuthorizedException.

另外,刷新令牌可以设置为 10 年左右,所以目前这不是问题。问题是旧访问令牌过期后不会创建新的访问令牌,并且我无法执行任何经过身份验证的用户操作。

有没有办法快速检查令牌是否有效——如果无效,则刷新它们?

android amazon-web-services amazon-cognito aws-amplify aws-sdk-android

5
推荐指数
1
解决办法
3972
查看次数

在刷新调用之间清除“PagingDataAdapter”

我正在使用 Paging 3PagingDataAdapter根据给定的查询搜索数据库。每次提交新查询时,我都会调用refresh()适配器上的方法。问题是在加载新数据之前,旧数据仍然存在。

有没有办法从列表中删除所有项目,以便在加载过程中不存在任何项目?此外,我使用ConcatAdapter来附加页眉和页脚以指示加载,因此我的目标是仅在加载数据/提交新查询时显示进度指示器。

更新:

我设法让它工作的唯一方法是调用,adapter.submitData(PagingData.empty())然后是pagingSource.invalidate(). 我不喜欢这个解决方案,因为访问invalidate()存储库层中可用的方法并不容易,我不得不在ViewModel. 有没有更优雅的方法来实现这一目标?我不认为这是一种方法,因为在加载期间刷新列表和删除项目的用例非常普遍,我认为在 Paging 3 库开发过程中已将其考虑在内。

android kotlin android-paging android-paging-3

5
推荐指数
1
解决办法
53
查看次数

如何使用 CameraX 将 PreviewView 纵横比与捕获的图像相匹配

我有一个PreviewView占据整个屏幕但工具栏除外。相机的预览效果很好,但是当我拍摄图像时,纵横比完全不同。

我想在成功捕获后向用户显示图像,因此它的大小与 相同,PreviewView因此我不必裁剪或拉伸它。

是否可以在每个设备上更改纵横比,它是它的大小PreviewView还是我必须将其设置为固定值?

android kotlin android-camera2 android-camerax

3
推荐指数
1
解决办法
848
查看次数