W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
Hello,我是V哥,在Android開發(fā)中,MVVM(Model-View-ViewModel)模式是一種流行的架構(gòu)設(shè)計(jì)模式,它通過清晰的職責(zé)劃分和數(shù)據(jù)綁定技術(shù),提高了代碼的可維護(hù)性和可測(cè)試性。以下是MVVM模式的實(shí)戰(zhàn)應(yīng)用與數(shù)據(jù)綁定技巧的概述:
下面來(lái)看一個(gè)示例:
比如一個(gè)用戶列表界面,包括Model、View和ViewModel的實(shí)現(xiàn),以及數(shù)據(jù)綁定的使用,具體來(lái)看一下實(shí)現(xiàn)。
首先,定義一個(gè)簡(jiǎn)單的用戶數(shù)據(jù)模型。
public class User {
private int id;
private String name;
private int age;
public User(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
接下來(lái),創(chuàng)建一個(gè)ViewModel來(lái)管理用戶數(shù)據(jù),并提供LiveData供View層觀察。
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
import java.util.List;
public class UserViewModel extends ViewModel {
private MutableLiveData<List<User>> usersLiveData;
public LiveData<List<User>> getUsersLiveData() {
if (usersLiveData == null) {
usersLiveData = new MutableLiveData<>();
fetchUsers();
}
return usersLiveData;
}
private void fetchUsers() {
// 模擬從數(shù)據(jù)庫(kù)或網(wǎng)絡(luò)獲取數(shù)據(jù)
List<User> users = List.of(
new User(1, "Alice", 25),
new User(2, "Bob", 30),
new User(3, "Charlie", 28)
);
usersLiveData.setValue(users);
}
}
定義一個(gè)Activity來(lái)展示用戶列表,并使用數(shù)據(jù)綁定。
import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private UserViewModel userViewModel;
private RecyclerView recyclerView;
private UserAdapter userAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 設(shè)置數(shù)據(jù)綁定
MainActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
userViewModel = new ViewModelProvider(this).get(UserViewModel.class);
binding.setUserViewModel(userViewModel);
binding.setLifecycleOwner(this);
recyclerView = binding.recyclerView;
recyclerView.setLayoutManager(new LinearLayoutManager(this));
userAdapter = new UserAdapter();
recyclerView.setAdapter(userAdapter);
userViewModel.getUsersLiveData().observe(this, users -> {
userAdapter.setUsers(users);
});
}
}
在res/layout/activity_main.xml
中定義Activity的布局,并啟用數(shù)據(jù)綁定。
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="userViewModel"
type="com.example.mvvm.UserViewModel"/>
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
</layout>
創(chuàng)建一個(gè)RecyclerView的Adapter來(lái)展示用戶列表。
import android.view.LayoutInflater;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
public class UserAdapter extends RecyclerView.Adapter<UserAdapter.UserViewHolder> {
private List<User> users;
public UserAdapter() {
}
public void setUsers(List<User> users) {
this.users = users;
notifyDataSetChanged();
}
@NonNull
@Override
public UserViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
return new UserViewHolder(inflater.inflate(R.layout.item_user, parent, false));
}
@Override
public void onBindViewHolder(@NonNull UserViewHolder holder, int position) {
User user = users.get(position);
holder.nameTextView.setText(user.getName());
holder.ageTextView.setText(String.valueOf(user.getAge()));
}
@Override
public int getItemCount() {
return users == null ? 0 : users.size();
}
static class UserViewHolder extends RecyclerView.ViewHolder {
TextView nameTextView;
TextView ageTextView;
UserViewHolder(View itemView) {
super(itemView);
nameTextView = itemView.findViewById(R.id.nameTextView);
ageTextView = itemView.findViewById(R.id.ageTextView);
}
}
}
在res/layout/item_user.xml
中定義用戶列表項(xiàng)的布局。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="16dp">
<TextView
android:id="@+id/nameTextView"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textSize="18sp" />
<TextView
android:id="@+id/ageTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp" />
</LinearLayout>
使用MVVM模式和數(shù)據(jù)綁定來(lái)創(chuàng)建一個(gè)用戶列表界面。ViewModel負(fù)責(zé)管理用戶數(shù)據(jù),并通過LiveData與View層通信。View層使用數(shù)據(jù)綁定來(lái)自動(dòng)更新UI。分工明確利于維護(hù),你說呢。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: