问题标签 [android-jetpack]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
4536 浏览

android-architecture-components - 不使用 Room 更新 PagingLibrary 中的列表项(仅限网络)

我正在使用分页库从网络加载数据ItemKeyedDataSource。获取项目后,用户可以对其进行编辑,此更新在内存缓存中完成(不使用像 Room 这样的数据库)。

现在,由于PagedList自身无法更新(在此处讨论),我必须重新创建PagedList并将其传递给PagedListAdapter.

更新本身没有问题,但是在recyclerView用 new更新之后PagedList,列表会跳转到列表的开头,从而破坏先前的滚动位置。无论如何在保持滚动位置的同时更新 PagedList (就像它如何与Room一起工作)?

DataSource是这样实现的:

像这样创建的PagedList

PagedListAdapter是这样创建的:

,并像这样更新:

PS:如果有更好的方法在不使用 Room 的情况下更新列表项,请分享。

0 投票
0 回答
349 浏览

android - Android 分页库 getItem raisesIllegalArgumentException

我将Architecture 组件的分页库与 RecyclerView 一起使用

当覆盖 getItemViewType 我调用

在“OnBindViewHolder”中调用相同的函数就像一个魅力

这是堆栈跟踪

java.lang.IllegalArgumentException:只有当最后一页仅存在于 android.arch.paging.PagedStorage.allocatePlaceholders(PagedStorage.java:404) 的 android.arch.paging.TiledPagedList.loadAroundInternal(TiledPagedList.java: 156) 在 android.arch.paging.PagedList.loadAround(PagedList.java:398) 在 android.arch.paging.AsyncPagedListDiffer.getItem(AsyncPagedListDiffer.java:201) 在 android.arch.paging.PagedListAdapter.getItem(PagedListAdapter.java :156) 在 me.ekhaled1619.redditur.ui.PostsAdapter.getItemViewType(PostsAdapter.kt:75) 在 android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5880) 在 android.support.v7。 widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5812) 在 android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2230) 在 android.support.v7 的 android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5808) .widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1557) 在 android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1517) 在 android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:612 ) 在 android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3595) 在 android.support.v7.widget.RecyclerView 的 android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3878)。 onLayout(RecyclerView.java:4148) 在 android.view.View.layout(View.java:17551) 在 android.view.ViewGroup.layout(ViewGroup.java:5614) 在 android.support.v4.widget.SwipeRefreshLayout.onLayout(SwipeRefreshLayout.java:625) 在 android.view.View.layout(View.java:17551 ) 在 android.view.ViewGroup.layout(ViewGroup.java:5614) 在 android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) 在 android.widget.FrameLayout.onLayout(FrameLayout.java:261) 在 android.view .View.layout(View.java:17551) 在 android.view.ViewGroup.layout(ViewGroup.java:5614) 在 android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741) 在 android.widget.LinearLayout.layoutVertical( LinearLayout.java:1585) 在 android.view.View.layout(View.java:17551) 在 android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) 在 android.widget.FrameLayout.onLayout(FrameLayout.java:261) 在 android.view.ViewGroup.layout(ViewGroup.java:5614) 在 android。 view.View.layout(View.java:17551) 在 android.view.ViewGroup.layout(ViewGroup.java:5614) 在 android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741) 在 android.widget.LinearLayout.layoutVertical (LinearLayout.java:1585) 在 android.view.View.layout(View.java:17551) 在 android.view.ViewGroup.layout(ViewGroup.java: 5614) 在 android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) 在 android.widget.FrameLayout.onLayout(FrameLayout.java:261) 在 com。android.internal.policy.DecorView.onLayout(DecorView.java:727) 在 android.view.View.layout(View.java:17551) 在 android.view.ViewGroup.layout(ViewGroup.java:5614) 在 android.view .ViewRootImpl.performLayout(ViewRootImpl.java:2379) 在 android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2106) 在 android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1283) 在 android.view.ViewRootImpl$TraversalRunnable。在 android.view.Choreographer.doCallbacks(Choreographer.java:685) 在 android.view.Choreographer.doFrame(Choreographer) 运行 (ViewRootImpl.java:6358) 在 android.view.Choreographer$CallbackRecord.run(Choreographer.java:873) .java:621) 在 android.os.Handler 的 android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:859)。handleCallback(Handler.java:754) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:165) 在 android.app.ActivityThread.main(ActivityThread.java :6365) 2018-06-24 22:37:11.892 26173-26173/me.ekhaled1619.redditur E/AndroidRuntime: 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android.internal.os.ZygoteInit $MethodAndArgsCaller.run(ZygoteInit.java:883) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:883) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773) 调用(本机方法)在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:883) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773) 调用(本机方法)

0 投票
1 回答
3650 浏览

android - Android 导航架构组件 - 导航架构组件是否意味着仅使用单个活动?

我目前正在学习新的Android 导航架构组件 (https://developer.android.com/topic/libraries/architecture/navigation/)。

我有点混淆它的动机和概念,这是我的不确定性:

  1. Android 导航架构组件是否旨在消除在单个应用程序中使用多个 Activity 的需要?这意味着,整个应用程序只需要一个单一的活动,而所有其他页面都将是片段?
  2. 在应用程序中使用多个活动,但同时使用Android 导航架构组件来导航 Fragment 是否实际上违反了Android 导航架构组件的目的?

问题 2 的示例场景

在此处输入图像描述

0 投票
2 回答
10453 浏览

android - 如何在 android 的工作管理器中传递 POJO 类?

我们如何通过工作管理器的 setData 方法在工作管理器中传递Serializable对象?有没有办法通过传递对象来处理工作管理器?

WorkManager 是一个用于将保证在满足其约束后执行的工作排入队列的库。WorkManager 允许观察工作状态和创建复杂工作链的能力。

它使应用程序崩溃并显示诸如 AddressBookData 之类的错误是无效类。

注意:我想在工作管理器中传递 POJO 类,并在 doWork 方法中从工作管理器获取 InputData。

0 投票
30 回答
156128 浏览

android - 处理 Android 导航组件中的后退按钮

我想知道如何使用导航控制器正确处理系统后退按钮操作。在我的应用程序中,我有两个片段(例如,片段 1 和片段 2),我在片段 1 中有一个动作,目的地是片段 2。除了一件事之外,一切都运行良好 - 当用户在 fragment2 中按下系统后退按钮时,我想显示一个对话框(例如使用 DialogFragment)来确认退出。实现此行为的最佳方法是什么?如果我app:defaultNavHost="true"在我的主机片段中使用,那么它会自动返回忽略我的规则。另外,这个组件是干什么用的?

在此处输入图像描述

我应该使用“pop to”可能吗?

0 投票
1 回答
5447 浏览

java - 迁移到 AndroidX - ResultReceiver 在哪里

在哪个新的 AndroidX 依赖项中ResultReceiver

我试过androidx.legacy:legacy-support-v4:1.0.0-alpha1了,假设它可能是v4由于它以前的依赖关系android.support.v4.os.ResultReceiver

我也试过这些:

我认为必须有一种更聪明的方法来找出新的依赖关系?

来源:迁移到 AndroidX

编辑,搜索开发者 API...

TraceCompat

TraceCompat 示例

接收结果

结果接收器示例

难道新系统里没有?

0 投票
3 回答
7866 浏览

android-recyclerview - PagedListAdapter 在接收到新的 PagedList 时跳转到列表的开头

我正在使用分页库从网络加载数据ItemKeyedDataSource。获取项目后,用户可以对其进行编辑,此更新在内存缓存中完成(不使用像 Room 这样的数据库)。

现在,由于PagedList自身无法更新(在此处讨论),我必须重新创建PagedList并将其传递给PagedListAdapter.

更新本身没有问题,但是在recyclerView用 new更新之后PagedList,列表会跳转到列表的开头,从而破坏先前的滚动位置。无论如何在保持滚动位置的同时更新 PagedList (就像它如何与Room一起工作)?

DataSource是这样实现的:

像这样创建的PagedList

PagedListAdapter是这样创建的:

,并像这样更新:

0 投票
0 回答
513 浏览

android - 在 PagedList.BoundaryCallback 中报告网络错误

我有一个以数据库(房间)作为单一事实来源的工作分页机制。我也将改造作为网络库,我使用 RxPagedListBulder 来保持所有东西的绑定和运行。

但是,我找不到将我的响应传回给视图的方法,因为网络内容以在成功的情况下插入数据库结束。我找不到报告网络错误的方法,并且可用教程中没有很好地解决该主题

对于那些想要完全理解这个问题的人,可以在github repo上找到工作代码。边界回调在这里

0 投票
3 回答
9313 浏览

android - 用于多个数据源的分页库 DataSource.Factory

新的分页库允许我们指定用于数据分页的自定义数据源。github 上的分页库文档和示例代码向我们展示了如何通过创建 DataSource.Factory 的子类来创建自定义数据源实例,如下所示:

在一个真实的应用程序中,您通常会有多个带有 recyclerviews 的视图,因此有多个自定义数据源。那么,您最终是为每个数据源创建多个 DataSource.Factory 实现,还是有更通用的解决方案?

0 投票
4 回答
4557 浏览

android - 导航上的片段生命周期重叠

我有一个Activity应用程序,其中多个应用程序Fragments正在使用导航组件进行切换。当我在两个片段之间切换时,它们的onCreate()onDestroy()方法似乎重叠。因此,当片段访问相同的全局对象时,我很难为片段编写初始化和清理代码。

Framgent_A从到导航Fragment_B具有以下方法顺序:

Fragment_A.onDestroy()我反转我在Fragment_A.onCreate(). 在我希望事情被调用Fragment_B时处于中立状态。onCreate()然而,情况并非如此,因为Fragment_A.onDestroy()尚未调用。

Android上的重叠是正常的还是我在导航组件中配置了错误?有没有另一种方法可以实现我想要做的事情?我知道我可以将两者结合Fragments起来并使其工作,但我不希望任何一个 Fragment 彼此了解。对我来说,在创建时Framgnet_A仍然活着,应该替换时似乎很奇怪。Fragment_BFragment_BFragment_A

任何帮助是极大的赞赏!


编辑:

在调试时浏览源代码后,我发现在FragmentNavigator.navigate() FragmentTransaction.setReorderingAllowed()被调用,它允许重新排序操作,甚至允许在前onCreate()一个片段之前调用新片段onDestroy()。问题仍然存在,在下一个 Fragment 中初始化相同的全局状态之前,如何解决我在一个 Fragment 中正确清理全局状态的问题。