标签: android-viewmodel

如何使用新的架构组件跟踪 android 中的当前位置?

我有一个项目,在其中我已经成功实现了位置跟踪功能,并且运行良好。我每 30 秒使用融合位置提供程序跟踪用户当前位置。(跟踪在 MainActivity 启动时开始)。

现在我计划使用新引入的 Android 架构组件来更新该项目。但我不知道如何使用视图模型实现位置跟踪。在MainActivity 或 Application类中,哪里是开始位置跟踪的正确位置?我应该使用ViewModel 还是 AndroidViewModel?如何实现这一目标。

android fusedlocationproviderapi android-livedata android-viewmodel android-architecture-components

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

如何使用 Factory 将自定义参数传递给 ViewModel?

我知道为了将自定义参数传递给ViewModel,我们可以使用ViewModelProvider.NewInstanceFactory,如下所示:

// Factory Class    
class MyFactory extends ViewModelProvider.NewInstanceFactory {

        private final String mId;
        public MyFactory(String id) {
            mId = id;
        }

        @NonNull
        @Override
        public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
            return (T) new MyViewModel(mId);
        }
    }


// MyViewModel class
class MyViewModel extends ViewModel {

  public MyViewModel(String id) {
     ...
  }
}

// Activity I can Initialise as: 
MyFactory modelFactory = new MyFactory(id);
viewModel = ViewModelProviders.of(this, modelFactory).get(MyViewModel.class);
Run Code Online (Sandbox Code Playgroud)

如何使用AndroidViewModel子类中的自定义参数以及应用程序上下文来实现相同的效果。喜欢

// MyAndroidViewModel class
    class MyAndroidViewModel …
Run Code Online (Sandbox Code Playgroud)

java android android-viewmodel android-architecture-components

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

如何更新 RecyclerView 项目内的绑定?

想象一个 StackOverflow 问题的列表,这些问题可以单独被赞成和反对。他们每个人都有一个计数,显示其投票数。单击 upvote 将该计数加一,单击 downvote 将该计数减一。这就是我要实现的目标的总体思路。rv_item.xmlRecyclerView 中单个项目的布局(为简洁起见):

data>
    <variable
        name="item"
        type="com.mycodez.Item"/>

    <variable
        name="vm"
        type="com.mycodez.ListViewModel" />
</data>

<Button
    android:id="@+id/decrease_quantity"
    android:onClick="@{() -> vm.decrementItemQuantity(item)}"/>

<TextView
    android:id="@+id/quantity"
    android:text="@{String.valueOf(item.quantity)}"
    tools:text="1" />

<Button
    android:id="@+id/increase_quantity"
    android:onClick="@{() -> vm.incrementItemQuantity(item)}"/>
Run Code Online (Sandbox Code Playgroud)

Where@+id/decrease_quantity类似于downvote,@+id/quantity类似于投票计数,@+id/increase_quantity类似于upvote。适配器:

class ListRvAdapter extends RecyclerView.Adapter<ListRvAdapter.ViewHolder> {
    private List<Item> items;
    private ListViewModel viewModel;
    private LifecycleOwner lifecycleOwner;

    ListRvAdapter(List<Item> items, ListViewModel viewModel, LifecycleOwner lifecycleOwner) {
        this.items = items;
        this.viewModel = viewModel;
        this.lifecycleOwner = lifecycleOwner;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int …
Run Code Online (Sandbox Code Playgroud)

android android-databinding android-livedata android-viewmodel

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

仅在 minifyEnabled 和 LifeCycle v 2.1.0 时创建 ViewModel 时应用程序崩溃

我的应用程序在LinkageError使用lazy{}. 崩溃仅在以下情况发生:

  1. minifyEnabledtrue在 build.gradle 中设置为,并且
  2. 我使用版本。2.1.0生命周期组件。它lifecycle-2.0.0minifyEnabled
    def lifecycle_version = '2.1.0'
    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
    implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
Run Code Online (Sandbox Code Playgroud)

此外,崩溃仅发生在其中一个视图模型上。在此之前触摸的同一活动中的其他视图模型不会使应用程序崩溃。


崩溃发生在这里的第二行:

    private val searchStackViewModel by lazy {
        ViewModelProviders.of(this)[SearchStateViewModel::class.java]
    }
Run Code Online (Sandbox Code Playgroud)

SearchStateViewModel是:

class SearchStateViewModel : ViewModel() {

    // Live data that initialises to empty stack with SearchStack.init
    private val privateStack = MutableLiveData<SearchStack>().apply {
        value = SearchStack()
    }

    // Observable view of search stack so it can't be directly modified
    internal val stateStack : LiveData<SearchStack> …
Run Code Online (Sandbox Code Playgroud)

android android-architecture-lifecycle android-viewmodel android-architecture-components android-jetpack

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

android 中的 MVVM 架构使用 Volley

我正在研究 MVVM,看看它是否可以帮助我完成我即将进行的项目。到目前为止我所理解的是,我需要使用ViewModel来保存我的 UI 数据。我还需要使用 Repository 类来执行我对 WebServices 的所有请求,并且我正在使用 Volley 库。

所以这就是我所做的:

视图模型

public class MyViewModel extends ViewModel {

    private MyRepository repository;
    private MutableLiveData<MyPojo> pojo;

    public MyViewModel(MyRepository repository) {
        this.repository = repository;
        this.pojo = new MutableLiveData<>();
    }

    public LiveData<MyPojo> updatePojo(){
        pojo.postValue(repository.getPojo());
        return pojo;
    }
}
Run Code Online (Sandbox Code Playgroud)

存储库类

public class MyRepository {

private Application application;
private LiveData<MyPojo> pojo;

public MyRepository(Application application) {
    this.application = application;
}

public MyPojo getPojo(){
    if(pojo == null){
        ApiRequest apiRequest = new ApiRequest(ApiSingleton.getInstance(application).getRequestQueue(), application);
        apiRequest.apiGetRequest(ApiRequest.MY_ENDPOINT, null, …
Run Code Online (Sandbox Code Playgroud)

java android mvvm android-volley android-viewmodel

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

弹出片段时未清除 SharedViewModel

我正在使用像这里这样的共享视图模型

但问题是,当我清除最后一个片段时,我想清除视图模型,或者杀死它的实例,但是当我离开使用它的最后一个片段时,它以某种方式幸存下来

如何以编程方式清除此视图模型?

我像这样使用它

片段A

private val model: SharedViewModel by activityViewModels()

    override fun onViewCreated() {

     model.getTotal().observe(viewLifecycleOwner, Observer { cartTotal ->
                total = cartTotal
            })

    }
Run Code Online (Sandbox Code Playgroud)

从片段 BI 发送的总数

Fragment B

private val model: SharedViewModel by activityViewModels()

    override fun onViewCreated() {

     model.setTotal = 10
}
Run Code Online (Sandbox Code Playgroud)

But when leaving Fragment A with that data (doing popBackStack since I'm using navigation components) it does not clear the viewmodel, instead when I open again my fragment , the data stills there

I …

android android-fragments kotlin android-viewmodel android-architecture-navigation

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

我可以在我的 Android 片段中消除视图模型和视图绑定样板代码吗?

我发现自己为我创建的每个新片段编写样板代码。这包括设置视图模型和视图绑定,这是我的代码的 2 个不同部分,它们不相互依赖,因此其中之一的解决方案仍然很棒。

片段代码示例:

class MyFragment : Fragment() {

    // View binding
    private var _binding: FragmentMyBinding? = null

    // View model
    private lateinit var model : MyViewModel

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Model init
        model = ViewModelProvider(this).get(MyViewModel::class.java)

        //binding init
        _binding = FragmentMyBinding.inflate(inflater, container, false)

        return _binding!!.root
    }

}

class MyViewModel : ViewModel()
Run Code Online (Sandbox Code Playgroud)

android boilerplate kotlin android-viewmodel android-viewbinding

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

ViewModel 没有零参数构造函数错误 - 即使它具有零参数构造函数

我是 Android 和 Java 新手,正在尝试制作基于位置的应用程序。

编辑

我制作了一个简单得多的测试代码并得到相同的错误。这是java:

package com.example.viewmodeltest;

import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;

import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    public class MyViewModel extends ViewModel {
        public int scoreTeamA = 0;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        MyViewModel locationViewModel = new ViewModelProvider(this).get(MyViewModel.class);
    }
}
Run Code Online (Sandbox Code Playgroud)

我犯了同样的错误。这是我的应用程序级 build.gradle 中的依赖项:

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'

    //dependencies for ViewModel, LiveData, etc.
    def lifecycle_version = "2.2.0"
    def …
Run Code Online (Sandbox Code Playgroud)

java android android-fusedlocation android-livedata android-viewmodel

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

Android Dagger Hilt:我们是否需要 ViewModel 的范围注释?

在我的应用程序中,我有一个需要访问 ViewModel 的 MainActivity。我正在使用 DaggerHilt 和 @ViewModelInject 注释注入 ViewModel。此外,我在 Activity 中有两个 Fragment,它们需要访问同一个 ViewModel,以便使用 observable 相互传递数据。

问题:我发现每当我的一个 Fragment 通过onDestroy()它的 ViewModel 时就会被杀死。这让我认为 Activity 和 Fragment 没有共享同一个 ViewModel。

我的问题:有谁知道我们是否应该在 Dagger Hilt 中为 ViewModel 使用范围注释?我在 Hilt 文档或 android 开发教程/指南中没有看到这一点。我曾假设他们正在制作 ViewModels 应用程序级别的单例,这是有道理的。

如果我们必须为 ViewModel 使用范围注释,有没有人知道哪个级别合适?

这是我的视图模型代码:

class MainActivityViewModel @ViewModelInject constructor(
    private val repo: Repo,
    private val rxSharedPrefsRepo: RxSharedPrefsRepo,
    private val resourcesRepo: ResourcesRepo,
    @Assisted private val savedStateHandle: SavedStateHandle
) : ViewModel() {
Run Code Online (Sandbox Code Playgroud)

android dagger android-viewmodel dagger-hilt

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

Koin 2.2.1:我不能在活动中使用“by viewModel”

不能从 Activity 使用“by viewModel”

我想为一个 Activity 注入一个 ViewModel,所以我尝试了这个。但它失败了,Android Studio 找不到它的参考。

private val mainViewModel: MainViewModel by viewModel()
Run Code Online (Sandbox Code Playgroud)

我的活动 extendsAppCompatActivity和 gradle 依赖项包括这些库:

implementation 'androidx.core:core-ktx:1.3.2'
def koin_version = '2.2.1'
implementation "org.koin:koin-android:$koin_version"
implementation "org.koin:koin-androidx-scope:$koin_version"
implementation "org.koin:koin-androidx-viewmodel:$koin_version"
implementation "org.koin:koin-androidx-fragment:$koin_version"
implementation "androidx.lifecycle:lifecycle-viewmodel-savedstate:$koin_version"
Run Code Online (Sandbox Code Playgroud)

我试过的:

下面的代码正在运行,但我想使用 Koin 2.2.0 的新默认“SavedStateHandle”功能。

private val mainViewModel: MainViewModel by inject()
Run Code Online (Sandbox Code Playgroud)

我发现此代码已包含在内,Android Studio 找不到它。

ActivityExt.kt:

inline fun <reified T : ViewModel> ComponentActivity.viewModel(
        qualifier: Qualifier? = null,
        noinline state: BundleDefinition? = null,
        noinline owner: ViewModelOwnerDefinition = { from(this, this) },
        noinline parameters: ParametersDefinition? …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-studio android-viewmodel koin

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