下面是一个解决Android中动态更改带有EditText错误的列表的示例代码,使用LiveData、Room和ViewModel:
首先,我们需要创建一个实体类,例如"Item",其中包含一个字符串字段用于存储列表项的文本内容:
@Entity(tableName = "items")
public class Item {
@PrimaryKey(autoGenerate = true)
private int id;
private String text;
// 省略构造函数和getter/setter方法
...
}
然后,我们创建一个DAO接口,用于定义对数据库的操作:
@Dao
public interface ItemDao {
@Query("SELECT * FROM items")
LiveData> getAllItems();
@Insert
void insertItem(Item item);
@Update
void updateItem(Item item);
@Delete
void deleteItem(Item item);
}
接下来,我们创建一个Database类,继承自RoomDatabase,并定义一个抽象方法来获取ItemDao实例:
@Database(entities = {Item.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
private static AppDatabase instance;
public abstract ItemDao itemDao();
public static synchronized AppDatabase getInstance(Context context) {
if (instance == null) {
instance = Room.databaseBuilder(context.getApplicationContext(),
AppDatabase.class, "app_database")
.fallbackToDestructiveMigration()
.build();
}
return instance;
}
}
然后,我们创建一个ViewModel类,用于处理数据逻辑和与UI的交互:
public class ItemViewModel extends AndroidViewModel {
private ItemDao itemDao;
private LiveData> items;
public ItemViewModel(@NonNull Application application) {
super(application);
AppDatabase database = AppDatabase.getInstance(application);
itemDao = database.itemDao();
items = itemDao.getAllItems();
}
public LiveData> getItems() {
return items;
}
public void insertItem(Item item) {
new InsertItemAsyncTask(itemDao).execute(item);
}
public void updateItem(Item item) {
new UpdateItemAsyncTask(itemDao).execute(item);
}
public void deleteItem(Item item) {
new DeleteItemAsyncTask(itemDao).execute(item);
}
private static class InsertItemAsyncTask extends AsyncTask- {
private ItemDao itemDao;
public InsertItemAsyncTask(ItemDao itemDao) {
this.itemDao = itemDao;
}
@Override
protected Void doInBackground(Item... items) {
itemDao.insertItem(items[0]);
return null;
}
}
private static class UpdateItemAsyncTask extends AsyncTask
- {
private ItemDao itemDao;
public UpdateItemAsyncTask(ItemDao itemDao) {
this.itemDao = itemDao;
}
@Override
protected Void doInBackground(Item... items) {
itemDao.updateItem(items[0]);
return null;
}
}
private static class DeleteItemAsyncTask extends AsyncTask
- {
private ItemDao itemDao;
public DeleteItemAsyncTask(ItemDao itemDao) {
this.itemDao = itemDao;
}
@Override
protected Void doInBackground(Item... items) {
itemDao.deleteItem(items[0]);
return null;
}
}
}
最后,我们在Activity或Fragment中使用ViewModel来更新和显示列表:
public class MainActivity extends AppCompatActivity {
private ItemViewModel itemViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
itemViewModel = ViewModelProviders.of(this).get(ItemViewModel.class);
final EditText editText = findViewById(R.id.editText);
Button addButton = findViewById(R.id.addButton);
final RecyclerView recyclerView = findViewById(R.id.recyclerView);
final ItemAdapter adapter = new ItemAdapter();
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
itemViewModel.getItems().observe(this, new Observer>() {
@Override
public void onChanged(List- items) {
adapter.setItems(items);
}
});
addButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String text = editText.getText().toString();
if (!text.isEmpty()) {
Item item = new Item();
item.setText(text);
itemViewModel.insertItem(item);
editText.setText("");
}
}
});
}
}
这