鉴于以下设置:
我有2个存储库:存储库A和存储库B它们都返回实时数据.
我有一个使用这两个存储库的ViewModel.
我想从Repository A中提取一些内容,并根据结果我想从Repository B中获取一些东西,然后在返回UI之前转换结果.
为此我一直在看LiveData Transformation类.这些例子显示了结果的单一转换,但是我想要链接两个转换的行.我怎么能做到这一点?
我尝试过像这样设置但在第二个转换块上出现类型不匹配:
internal val launchStatus: LiveData<String> = Transformations
.map(respositoryA.getData(), { data ->
if (data.isValid){
"stringA"
} else {
//This gives a type mismatch for the entire block
Transformations.map(repositoryB.getData(), {
result -> result.toString()
})
}
})
Run Code Online (Sandbox Code Playgroud)
(另请告诉我是否有替代/推荐的方法来抓取链接这些呼叫的东西,即从A抓取一些东西然后根据A的结果从B中抓取一些东西,依此类推)
android kotlin android-livedata android-architecture-components
我一直在使用RecyclerView实现新的Paging Library,其中应用程序构建在Architecture Components之上.
填充列表的数据来自Room数据库.实际上,它是从网络中获取的,存储在本地数据库中并提供给列表.
为了提供构建列表所需的数据,我实现了自己的自定义PageKeyedDataSource.一切都按预期工作,除了一个小细节.显示列表后,如果列表行元素的数据发生任何更改,则不会自动更新.因此,例如,如果我的列表显示了具有字段名称的项目列表,并且突然,该字段在本地Room数据库中针对特定行项目更新,则列表不会自动更新行UI.
仅当使用自定义DataSource时才会发生此行为,这与通过直接返回DataSource Factory从DAO自动获取DataSource不同.但是,我需要实现自定义DataSource.
我知道可以通过调用DataSource上的invalidate()方法来重新更新列表来更新它.但是,如果应用程序一次显示2个列表(例如每个半屏),并且此项目出现在两个列表中,则需要分别为两个列表调用invalidate().
我想过一个解决方案,其中,不是使用item的类的实例来填充每个ViewHolder,而是使用它的LiveData包装版本,使每行观察其自己项目的更改并在必要时更新该行UI .不过,我看到这种方法有一些缺点:
我根本不知道,即使考虑到这些缺点,它看起来似乎是一种体面的方法,或者,如果你们中的任何人知道任何其他更清洁和更好的方法来管理它.
先感谢您.
android list android-livedata android-architecture-components android-paging
我以两种不同的方式提供片段之间的数据传输,首先是正常工作,而安全的数据类型会导致运行时崩溃。我正在使用该Android文档:https : //developer.android.com/topic/libraries/architecture/navigation/navigation-implementing#Safe-args
不明白如何解决该问题。谢谢你的帮助
07-13 11:40:07.986 8119-8119/com.flexdecision.ak_lex.navigationsimple E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.flexdecision.ak_lex.navigationsimple, PID: 8119
java.lang.IllegalArgumentException: navigation destination com.flexdecision.ak_lex.navigationsimple:id/transferAction is unknown to this NavController
at androidx.navigation.NavController.navigate(NavController.java:669)
at androidx.navigation.NavController.navigate(NavController.java:628)
at androidx.navigation.NavController.navigate(NavController.java:690)
at com.flexdecision.ak_lex.navigationsimple.InitialFragment.makeTransfer(InitialFragment.java:58)
at com.flexdecision.ak_lex.navigationsimple.InitialFragment.lambda$onViewCreated$0(InitialFragment.java:47)
at com.flexdecision.ak_lex.navigationsimple.-$$Lambda$InitialFragment$shEoLbIe0sVhbTcJ2Al_FvBuU7g.onClick(lambda)
at android.view.View.performClick(View.java:5198)
at android.view.View$PerformClick.run(View.java:21147)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Run Code Online (Sandbox Code Playgroud)
导航图:
07-13 11:40:07.986 8119-8119/com.flexdecision.ak_lex.navigationsimple E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.flexdecision.ak_lex.navigationsimple, PID: 8119
java.lang.IllegalArgumentException: navigation destination com.flexdecision.ak_lex.navigationsimple:id/transferAction is unknown to this NavController
at androidx.navigation.NavController.navigate(NavController.java:669)
at …Run Code Online (Sandbox Code Playgroud) java android android-navigation android-architecture-components android-jetpack
我一直在测试Livedata和AAC.
LiveData和ObservableField之间的核心区别是什么?
哪一个是最好的,何时应该使用另一个?
我正在尝试使用新的WorkManager API 1.0.0-alpha06每15分钟运行一次工作.如果我没有错,使用带有PeriodicWorkRequest的工作管理器应该让工作人员彻底查看任务并重新启动电话,但是当我从最近的应用程序中滑动任务时,预定的工作人员会丢失(我等了大约45分钟才看到任何人工人的日志安排15分钟间隔).
这些是我的文件:
MyExampleWorker.java:
public class MyExampleWorker extends Worker{
public static final String TAG = "MY_EXAMPLE_WORKER";
@NonNull
@Override
public Result doWork() {
Log.i(TAG, "Starting background worker");
// Getting configuration data
long param1 = getInputData().getLong("param1", 60000);
String param2 = getInputData().getString("param2");
String param3 = getInputData().getString("param3");
PackageManager pckMgr = mContext.getPackageManager();
...
..
.
return Result.SUCCESS;
}
}
Run Code Online (Sandbox Code Playgroud)
Main.java:一旦应用程序启动,此方法就会触发
@ReactMethod
public void execute() {
Log.i(TAG, "inside execute, setting up periodic worker in workManager");
Data inputData = new Data.Builder()
.putLong("param1", 60000)
.putString("param2", "something")
.putString("param3", …Run Code Online (Sandbox Code Playgroud) android android-service android-architecture-components android-jetpack android-workmanager
我使用Paging with Retrofit从REST API加载Notifications数据列表.
当我按下通知项目的删除按钮时,我调用删除API删除它.PagedListAdapter删除API响应成功后删除它的正确方法是什么?PagedList或PagedListAdapter不支持通过索引或对象删除项目.
我试着打电话DataSource.validate()但它从开始重新加载,而不是从当前页面重新加载.
我正在尝试学习View-model android,在我学习的第一阶段我试图通过使用视图模型和数据绑定来更新UI(Textview).在View模型中,我有一个aynctask回调,它将调用REST api调用,我正在输出,但我没有更新textview中的值.
我的viewmodel类
public class ViewModelData extends ViewModel {
private MutableLiveData<UserData> users;
public LiveData<UserData> getUsers() {
if (users == null) {
users = new MutableLiveData<UserData>();
loadUsers();
}
return users;
}
public void loadUsers() {
ListTask listTask =new ListTask (taskHandler);
listTask .execute();
}
public Handler taskHandler= new Handler() {
@Override
public void handleMessage(Message msg) {
UserData userData = (UserData) msg.obj;
users.setValue(userData);
}
};
Run Code Online (Sandbox Code Playgroud)
}
和主要课程
public class MainActivity extends AppCompatActivity implements LifecycleOwner {
private LifecycleRegistry mLifecycleRegistry;
private TextView fName;
@Override …Run Code Online (Sandbox Code Playgroud) android-databinding android-livedata android-viewmodel android-architecture-components
我正在尝试实现具有动态功能的新导航组件
所以结构看起来像这样:
dynamicFeatures = []在gradle中包含动态程式)特征
库-> globalNav
我一直在阅读很多没有成功的方法,因为每个功能都是完全隔离的,如何将它们粘合在一起而不相互依赖
例如,应用程序(app module)以开头,SplashActivity并检查会话状态,所以我的问题是我应该如何启动login_graph或home_graph,在第一种情况下,应在完成身份验证流程后启动主目录?
我目前正在尝试将它们粘合在一起的方式是使用一个globalNav模块(android-library),我发现了一些解决方法:
Intent().setClassName(context.packageName, className).also { context.startActivity(it) }
Run Code Online (Sandbox Code Playgroud)
深层链接(我想用作导航图的深层链接已包含那些链接),但是由于某种原因,即使只有我的应用程序使用它,它也始终显示“选择完整操作”选择器。
actions与深度链接相同的行为任何建议将是巨大的:)
PS:我一直在浏览/阅读的一些参考资料:
https://www.youtube.com/watch?v=ST2W1Y_Ztvk
https://jeroenmols.com/blog/2019/04/02/modularizationexample/
GitHub googlesamples资料库
PSS:如果我找到一个好的解决方案,我会尽力解决这个问题,我将确保也回答。
对于目前对此尚不支持的任何对此感兴趣的人,您可以在此处加注星标:https : //issuetracker.google.com/issues/132170186
android android-intent android-instant-apps android-architecture-components android-architecture-navigation
我正在尝试使用运动布局制作动画,并希望将 scrollView 设置为运动场景 onSwipe Transition 的 targetAnchor,但它不起作用。也许我对 onSwipe 过渡一无所知。
这是我的布局文件
<androidx.constraintlayout.motion.widget.MotionLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/main_background_color"
app:layoutDescription="@xml/base_scroll_scene">
<ImageView
android:id="@+id/background_image"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginBottom="@dimen/scrollable_background_image_margin_bottom"
android:scaleType="centerCrop"
android:src="@drawable/lift_bg"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="@dimen/top_gradient_mask_height"
android:background="@drawable/top_gradient_mask"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/ski_more_logo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/ski_more_logo_margin_top"
android:src="@drawable/ic_skimore_logo"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/locked_icon"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_marginTop="@dimen/locked_icon_margin_top"
android:src="@drawable/ic_lock"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/ski_more_logo" />
<FrameLayout
android:id="@+id/bottom_gradient_mask"
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="@drawable/bottom_gradient_mask"
app:layout_constraintBottom_toBottomOf="@+id/background_image" />
<ScrollView
android:id="@+id/content_scroll_view"
android:layout_width="match_parent"
android:layout_height="0dp"
android:overScrollMode="never"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent">
<FrameLayout
android:id="@+id/content_container_view"
android:layout_width="match_parent"
android:clickable="false"
android:layout_height="match_parent" />
</ScrollView>
</androidx.constraintlayout.motion.widget.MotionLayout>
Run Code Online (Sandbox Code Playgroud)
在滚动视图中,我以编程方式添加了一些高度较大的内容,这些内容将是可滚动的。
这是我的动作场景 …
在ViewModel和之间进行通信的正确方法是什么View,Google architecture components使用LiveData视图订阅更改并相应地更新自身,但这种通信不适用于单个事件,例如显示消息、显示进度、隐藏进度等。
有一些像SingleLiveEventGoogle 示例中的hack ,但它仅适用于 1 个观察者。一些开发人员使用EventBus但我认为当项目增长时它会很快失控。
有没有方便正确的实现方式,你是如何实现的?
(也欢迎 Java 示例)
android-architecture-components ×10
android ×9
android-architecture-navigation ×1
java ×1
kotlin ×1
list ×1