0
点赞
收藏
分享

微信扫一扫

Android。怎么初始化一个有参的viewmodel

Android - 如何初始化一个有参的 ViewModel

在 Android 开发中,ViewModel 是一种用于存储和管理与 UI 相关的数据的类。通常情况下,我们可以使用无参的构造函数来初始化 ViewModel,但有时我们需要在创建 ViewModel 实例时传递一些参数。本文将介绍如何初始化一个有参的 ViewModel,并解决一个实际问题。

实际问题

假设我们有一个应用程序,用于展示用户的个人信息。我们的用户数据存储在一个数据库中,并使用 Repository 来访问和操作这些数据。我们希望在展示用户信息的界面中使用一个 ViewModel 来管理用户数据,并在创建 ViewModel 实例时传递一个用户 ID。

初始化有参的 ViewModel

要初始化一个有参的 ViewModel,我们需要使用 ViewModelProvider 的工厂方法 ViewModelProvider.Factory。首先,我们需要创建一个自定义的 ViewModelFactory 类,实现 ViewModelProvider.Factory 接口,并在其构造函数中接受我们所需的参数。

public class UserViewModelFactory implements ViewModelProvider.Factory {
    private String userId;

    public UserViewModelFactory(String userId) {
        this.userId = userId;
    }

    @NonNull
    @Override
    public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
        if (modelClass.isAssignableFrom(UserViewModel.class)) {
            return (T) new UserViewModel(userId);
        }
        throw new IllegalArgumentException("Unknown ViewModel class");
    }
}

在这个示例中,我们的 UserViewModelFactory 类接受一个 userId 参数,并在 create 方法中返回一个 UserViewModel 实例。

接下来,我们可以在 Activity 或 Fragment 中使用这个自定义的 ViewModelFactory 来初始化 ViewModel。我们只需创建一个 ViewModelProvider 对象,并在其构造函数中传递 ViewModelFactory 实例和当前的 Activity 或 Fragment。

public class UserProfileActivity extends AppCompatActivity {
    private UserViewModel userViewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_user_profile);

        String userId = getIntent().getStringExtra("userId");
        UserViewModelFactory factory = new UserViewModelFactory(userId);
        userViewModel = new ViewModelProvider(this, factory).get(UserViewModel.class);

        // 使用 userViewModel 进行数据操作...
    }
}

在这个示例中,我们从 Intent 中获取了传递的 userId,并创建了一个 UserViewModelFactory 实例。然后,我们使用 ViewModelProvider 对象和 Factory 实例来获取 UserViewModel 对象。

现在,我们已经成功地初始化了一个有参的 ViewModel,并可以在 Activity 或 Fragment 中使用它来获取和操作数据。

示例应用程序

为了更好地理解如何初始化一个有参的 ViewModel,我们创建了一个简单的示例应用程序。这个应用程序包含一个用户列表和用户详细信息的界面。

首先,我们需要定义一个 User 实体类来表示用户数据。

public class User {
    private String id;
    private String name;
    private int age;

    // 构造函数、getter 和 setter 方法...
}

然后,我们创建一个 UserRepository 类来模拟用户数据的访问和操作。

public class UserRepository {
    private List<User> userList;

    public UserRepository() {
        userList = new ArrayList<>();
        userList.add(new User("1", "John", 25));
        userList.add(new User("2", "Mary", 30));
        // 添加更多用户...
    }

    public User getUserById(String userId) {
        for (User user : userList) {
            if (user.getId().equals(userId)) {
                return user;
            }
        }
        return null;
    }
}

接下来,我们创建一个 UserViewModel 类来管理用户数据。

public class UserViewModel extends ViewModel {
    private UserRepository userRepository;
    private String userId;
    private MutableLiveData<User> userLiveData;

    public UserViewModel(String userId) {
        userRepository = new UserRepository();
        this.userId = userId;
    }

    public LiveData<User> getUser() {
        if (userLiveData == null) {
            userLiveData = new MutableLiveData<>();
            loadUser();
        }
        return userLiveData;
    }

    private void loadUser() {
        User user = userRepository.getUserById(userId);
        userLiveData.setValue(user);
    }
}

在这个示例中,我们的 UserViewModel 类接受一个 userId 参数,并在初始化时创建一个 UserRepository 实例。我们还定义了一个 User LiveData 对象来存储用户数据,并在 loadUser 方法中使用 UserRepository 获取用户,并更新 LiveData。

最后,我们创建一个 UserProfileActivity 类来展示用户详细信息。

public class UserProfileActivity extends AppCompatActivity {
    private UserViewModel userViewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_user_profile);

举报

相关推荐

0 条评论