标签: android-mvvm

使用DataBinding将文本的某些部分加粗

我想将文本的某些部分设置为粗体,其值是通过使用DataBinding和ViewModel设置的。

例如

如果您被选中,则将为您的一对支付160美元

我正在使用字符串资源

<string name="product_price">If you are selected, you will have to pay $%d for your pair.</string>

<TextView
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:layout_marginEnd="@dimen/spacing_xlarge"
          android:layout_marginStart="@dimen/spacing_xlarge"
          android:layout_marginBottom="@dimen/spacing_small"
          android:text="@{@string/product_price(productPrice)}"
          android:textColor="@color/button_tertiary"
          android:visibility="@{productPrice > 0}"
          style="@style/Body.Small"
          />
Run Code Online (Sandbox Code Playgroud)

当前通过ViewModel和Binding通过设置传递产品价格 binding.setProductPrice(Object.getPrice())

我知道以下解决方案:但想尝试使用DataBinding

  • 使用HTML文本-但不想在代码中使用它。
  • 在水平样式中使用其他TextView。将样式设置为该产品价格的粗体。-实在不好
  • 使用SpannableString-但不想在代码中使用它。

但是上述所有解决方案都是解决方法。

题 ::

Want to try DataBinding feature which can be used to style certain part of string. Just like SpannableString

Manipulate String in the Layout file using DataBinding

android android-databinding android-mvvm

5
推荐指数
2
解决办法
1527
查看次数

带有 MVVM 架构组件的 StartActivityForResult

在其中一个 Google Codelabs 中,Activity1显示一个RecyclerView和 按钮单击打开Activity2,可以在其中添加新条目。

他们不是访问ViewModelinActivity2并将条目直接添加到数据库中,而是将条目发送回Activity1并将其插入那里。

这背后的原因是什么?为什么要发回数据Activity1?为什么不叫ViewModelProviders.of(this)Activity2和插入那里的项目吗?

FloatingActionButton fab = findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(MainActivity.this, NewWordActivity.class);
            startActivityForResult(intent, NEW_WORD_ACTIVITY_REQUEST_CODE);
        }
    });
}

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == NEW_WORD_ACTIVITY_REQUEST_CODE && resultCode == RESULT_OK) {
        Word word = new Word(data.getStringExtra(NewWordActivity.EXTRA_REPLY));
        mWordViewModel.insert(word);
    } else {
        Toast.makeText( …
Run Code Online (Sandbox Code Playgroud)

android android-mvvm android-viewmodel android-architecture-components

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

android中的MVVM,在不破坏模式的情况下访问assetManager

我在资产文件夹中有一个 JSON 文件,而 DataManager(repository) 类需要它,因此资产管理器(和上下文)应该可以访问资产。

问题是基于最佳实践,Android 上下文或 android 特定代码不应该传递到数据层(ViewModel-Repo-Model),因为容易编写单元测试等,并且视图不应该直接与数据层交互。

我最终提供了使用列表并将其注入存储库。

这是正确的做法吗?

-谢谢

PS:我提供列表的模块类

@Module
public class UtilModule {

    @Provides
    @JsonScope
    JsonUtil provideJsonUtil(AssetManager assetManager){
        return new JsonUtil(assetManager);
    }

    @Provides
    @JsonScope
    String provideJson(JsonUtil util){
        return util.getJson();
    }

    @Provides
    @JsonScope
    Type provideType(){
        return new TypeToken<List<Data>>() {}.getType();
    }
    @Provides
    @JsonScope
    DataManager provideDataManager (Gson gson, Type type,String json) {
        return new DataManager (gson.fromJson(json, type));
    }
}
Run Code Online (Sandbox Code Playgroud)

android android-assets android-mvvm

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

更新回收视图中的单个项目。我正在使用分页库并想更新单个项目/行

我使用提交列表将 pagedlist 值传递给适配器。当我更新单个项目时,请考虑我正在点击回收器视图中的提要的类似按钮。如何更新单个项目。

我正在按照这个例子进行分页实现

https://github.com/saquib3705/PagingLibrarySampleApp

它只是加载数据并更新回收器视图。我想为项目添加“喜欢”按钮,并在用户喜欢如何实现它时更新列表。另请看看这正是我正在寻找的 更新列表项在 PagingLibrary 中不使用 Room(仅限网络)

android android-mvvm android-architecture-components android-jetpack android-paging-library

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

使用MVVM架构和数据绑定时如何突出显示recyclerview项目?

我试图在遵守 MVVM 原则并使用数据绑定的同时突出显示 recyclerview 项目。但我无法理解如何处理选择行。

我目前使用以下接口将我的 recyclerview 项目 onclick 传递到视图模型:

public interface ItemClickListener
{
    void onItemClicked(String id);
}
Run Code Online (Sandbox Code Playgroud)

onclick 视图是数据绑定的:

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>
        <variable
            name="model"
            type="Item" />

        <variable
            name="listener"
            type="ItemClickListener" />
    </data>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@{model.name}"
        android:onClick="@{() -> listener.onItemClicked(model.name)}" />
</layout>
Run Code Online (Sandbox Code Playgroud)

视图模型实现了该接口,因此我可以引用该项目。侦听器在活动中实例化并传递到适配器中。

我将如何处理选择 recyclerview 项目(并为其指定背景颜色)?viewholder 是否应该实现 onClickListener(View view) 并将其及其位置通过我的界面传递?

android android-recyclerview android-databinding android-mvvm

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

即使添加“核心测试”依赖项后,也无法在我的“jUnit”测试用例中导入 InstantTaskExecutorRule - Android 测试

我正在为我的LoginViewModel. 我想setValue()在我的MutableLiveData.

为了避免android.os.Looper 中的方法 getMainLooper 未模拟异常,我尝试在test 文件夹Rule内的 ViewModel 文件中添加以下内容。

@Rule public InstantTaskExecutorRule mInstantTaskExecutorRule = new InstantTaskExecutorRule();

为此,我添加了以下依赖项:

androidTestImplementation 'android.arch.core:core-testing:1.1.1' as dependency.
Run Code Online (Sandbox Code Playgroud)

但是,我仍然无法InstantTaskExecutorRule在我的 LoginViewModelTest 文件中导入。可能是什么问题?

尽管它被导入到androidTest文件夹中,我们在其中编写集成或 UI 测试用例!但不在我们编写 jUnit 测试用例的测试文件夹中!

先感谢您。

请参考构建。梯度文件:

apply plugin: 'com.android.application'

    android {
    compileSdkVersion 28
    defaultConfig {
    applicationId "com.test.login"
    minSdkVersion 19
    targetSdkVersion 28
    versionCode 2
    versionName "1.1"
    multiDexEnabled true
    testInstrumentationRunner 
    "android.support.test.runner.AndroidJUnitRunner"
}

dataBinding {
    enabled = true
}

testOptions {
    unitTests.returnDefaultValues …
Run Code Online (Sandbox Code Playgroud)

unit-testing viewmodel android-testing android-mvvm mutablelivedata

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

当点击 recyclerview 项时如何更新 viewModel 的实时数据

我是 Kotlin 新手,我正在尝试使用 MVVM 创建应用程序。所以我想做的是使用存储库中的改造进行网络调用,并将数据返回到视图模型,然后观察片段中的数据,一旦数据发生变化,我就会将其通知回收器视图适配器,一切都会发生工作正常。现在,问题是我想从 recyclerview 更新 ViewHolder 的实时数据。当我单击 recyclerView 中的复选框时,应该更新数据。但我不知道这样做的实际方法是什么。

这是我的 ViewHolder。

class MainActivityViewModel : ViewModel() {

private var mutableLiveGitUsers: MutableLiveData<ArrayList<GitUsers>>? = null
private lateinit var gitUsersRepository: GitUsersRepository
var allUsersListener: AllUsersListener? = null

fun init() {

    gitUsersRepository = GitUsersRepository()
    allUsersListener?.onStarted()
    mutableLiveGitUsers = gitUsersRepository.getGitUsers()
    allUsersListener?.onSuccess(mutableLiveGitUsers!!)
}

fun getGitUsersData(): MutableLiveData<ArrayList<GitUsers>>? {
    return mutableLiveGitUsers
}
Run Code Online (Sandbox Code Playgroud)

}

这是我观察片段变化的方式

mutableLiveGitUsers.observe(this, Observer {
        progressBar.hide()
        rvAllUsersAdapter = AllUsersAdapter(mainActivityViewModel.getGitUsersData()?.value!!)
        rvAllUsers.adapter = rvAllUsersAdapter
        rvAllUsersAdapter.notifyDataSetChanged()
    })
Run Code Online (Sandbox Code Playgroud)

RecylerView 适配器

class AllUsersAdapter(private var gitUsersArrayList: ArrayList<GitUsers>) :
RecyclerView.Adapter<AllUsersAdapter.AllUsersViewHolder>() {

override fun onCreateViewHolder(parent: …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-recyclerview android-mvvm android-livedata

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

MVVM-包含布局内的 Recyclerview 从未初始化

我有一个通用列表,需要在我的应用程序中的大多数活动/片段上显示。为此,我创建了一个布局并在其中添加了回收器,如下面的代码所示。然后根据需要将该布局包含在活动/片段中。我正在使用 MVVM 和 android 绑定。我的问题是 recyclerview 的 onCreateViewHolder 甚至 getItemCount 从未被调用。我的 updateList 函数从视图模型成功调用,列表中有 2 项,但 notifydatasetchanged 没有任何效果。我做错了什么?这是我的代码。适配器类

class FaqsAdapter : RecyclerView.Adapter<FaqsAdapter.MyViewHolder>() {
    lateinit var binding: FaqItemBinding
    lateinit var listFaqs: List<ModelFaqs>

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        val inflater = LayoutInflater.from(parent.context)
        binding = DataBindingUtil.inflate(inflater, R.layout.faq_item, parent, false)
        return MyViewHolder(binding)
    }

    override fun getItemCount(): Int {
        return if (::listFaqs.isInitialized) listFaqs.size else 0
    }

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        holder.bind(listFaqs[position])
    }

    fun updateList(faqs: List<ModelFaqs>) {
        this.listFaqs = faqs //this …
Run Code Online (Sandbox Code Playgroud)

android android-recyclerview android-databinding android-mvvm

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

如何编写使用 Context 从 Android 框架检索数据的用例

我正在将一个应用程序迁移到 MVVM 和干净的架构,但我遗漏了这个难题的一部分。

问题域:

列出设备上的所有应用程序并将其显示在 Fragment / Activity 中

设备应用程序由其包名称表示:

data class DeviceApp(val packageName: String)

设备应用程序的列出方式如下:

private fun listAllApplications(context: Context): List<DeviceApp> {
    val ans = mutableListOf<DeviceApp>()

    val packageManager: PackageManager = context.applicationContext.packageManager
    val packages = packageManager.getInstalledApplications(PackageManager.GET_META_DATA)
    for (applicationInfo in packages) {
        val packageName = applicationInfo.packageName
        ans.add(DeviceApp(packageName))
    }

    return ans
}
Run Code Online (Sandbox Code Playgroud)

据我了解,调用listAllApplications()应该在“域层”内的用例中完成,该用例由ViewModel.

但是listAllApplications收到一个Context, 并且域层应该只是纯代码。

在干净的架构/MVVM 中,我应该放在哪一层listAllApplications(context)

更一般地说,ViewModel 应如何与需要Context(位置等)的 Android 框架 API 进行交互?

android use-case mvvm clean-architecture android-mvvm

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

Service 和 ViewModel 之间的 MVVM 通信

我有一个Service每秒通过 http 请求加载数据的程序。

我想知道如何在我当前的 MVVM 结构中实现该服务。

我能想到的解决方案是:

  1. View调用方法来自ViewModel
  2. ViewModel调用方法来自Repository
  3. 启动ServiceRepository传入 some LiveData,因为存储库应该负责数据加载。
  4. LiveDataServicevia中更新此内容postValue()
  5. 在 UI 中观察这一点LiveData并通知ViewModel更改
  6. 获取ViewModel更改LiveData并相应更新视图的其他 LiveData
  7. Service根据步骤 6 的结果停止

但是,我想知道是否有更好的解决方案可以更直接地从ServiceViewModel甚至从ServiceRepository进行通信ViewModel

android android-service android-mvvm android-architecture-components

5
推荐指数
0
解决办法
1904
查看次数