我想将文本的某些部分设置为粗体,其值是通过使用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"
          />
当前通过ViewModel和Binding通过设置传递产品价格 binding.setProductPrice(Object.getPrice())
我知道以下解决方案:但想尝试使用DataBinding
但是上述所有解决方案都是解决方法。
题 ::
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
在其中一个 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( …android android-mvvm android-viewmodel android-architecture-components
我在资产文件夹中有一个 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));
    }
}
我使用提交列表将 pagedlist 值传递给适配器。当我更新单个项目时,请考虑我正在点击回收器视图中的提要的类似按钮。如何更新单个项目。
我正在按照这个例子进行分页实现
https://github.com/saquib3705/PagingLibrarySampleApp
它只是加载数据并更新回收器视图。我想为项目添加“喜欢”按钮,并在用户喜欢如何实现它时更新列表。另请看看这正是我正在寻找的 更新列表项在 PagingLibrary 中不使用 Room(仅限网络)
android android-mvvm android-architecture-components android-jetpack android-paging-library
我试图在遵守 MVVM 原则并使用数据绑定的同时突出显示 recyclerview 项目。但我无法理解如何处理选择行。
我目前使用以下接口将我的 recyclerview 项目 onclick 传递到视图模型:
public interface ItemClickListener
{
    void onItemClicked(String id);
}
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>
视图模型实现了该接口,因此我可以引用该项目。侦听器在活动中实例化并传递到适配器中。
我将如何处理选择 recyclerview 项目(并为其指定背景颜色)?viewholder 是否应该实现 onClickListener(View view) 并将其及其位置通过我的界面传递?
android android-recyclerview android-databinding android-mvvm
我正在为我的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.
但是,我仍然无法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 …unit-testing viewmodel android-testing android-mvvm mutablelivedata
我是 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
}
}
这是我观察片段变化的方式
mutableLiveGitUsers.observe(this, Observer {
        progressBar.hide()
        rvAllUsersAdapter = AllUsersAdapter(mainActivityViewModel.getGitUsersData()?.value!!)
        rvAllUsers.adapter = rvAllUsersAdapter
        rvAllUsersAdapter.notifyDataSetChanged()
    })
RecylerView 适配器
class AllUsersAdapter(private var gitUsersArrayList: ArrayList<GitUsers>) :
RecyclerView.Adapter<AllUsersAdapter.AllUsersViewHolder>() {
override fun onCreateViewHolder(parent: …android kotlin android-recyclerview android-mvvm android-livedata
我有一个通用列表,需要在我的应用程序中的大多数活动/片段上显示。为此,我创建了一个布局并在其中添加了回收器,如下面的代码所示。然后根据需要将该布局包含在活动/片段中。我正在使用 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 …android android-recyclerview android-databinding android-mvvm
我正在将一个应用程序迁移到 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
}
据我了解,调用listAllApplications()应该在“域层”内的用例中完成,该用例由ViewModel.
但是listAllApplications收到一个Context, 并且域层应该只是纯代码。
在干净的架构/MVVM 中,我应该放在哪一层listAllApplications(context)?
更一般地说,ViewModel 应如何与需要Context(位置等)的 Android 框架 API 进行交互?
我有一个Service每秒通过 http 请求加载数据的程序。
我想知道如何在我当前的 MVVM 结构中实现该服务。
我能想到的解决方案是:
View调用方法来自ViewModelViewModel调用方法来自RepositoryService并Repository传入 some LiveData,因为存储库应该负责数据加载。LiveData在Servicevia中更新此内容postValue()。LiveData并通知ViewModel更改ViewModel更改LiveData并相应更新视图的其他 LiveDataService根据步骤 6 的结果停止但是,我想知道是否有更好的解决方案可以更直接地从Service到ViewModel甚至从Service到Repository进行通信ViewModel
android android-service android-mvvm android-architecture-components
android-mvvm ×10
android ×9
android-architecture-components ×3
kotlin ×1
mvvm ×1
unit-testing ×1
use-case ×1
viewmodel ×1