android studio MVVM 不存储或显示日期
android studio MVVM doesn't store date or display it
抱歉打扰你们,但我一直在关注 CodingInFlow 的 MVVM,一切顺利,直到到达第 7 个视频,我创建了两个活动:MainActivity 和 [每当我移动到MainActivity2 并输入一些数据并返回到 MainActivity,我看到没有项目被添加到 RecyclerView 但 Toasts 工作。
Ps:我是 Whosebug 的新手所以请原谅我
这是我的文件:
主要活动
public class MainActivity<O> extends AppCompatActivity {
private ActivityMainBinding mainBinding;
private NoteViewModel viewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mainBinding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(mainBinding.getRoot());
viewModel =new ViewModelProvider(this).get(NoteViewModel.class);
NoteAdapter adapter = new NoteAdapter();
mainBinding.recyclerView.setAdapter(adapter);
mainBinding.recyclerView.setLayoutManager(new LinearLayoutManager(this));
mainBinding.recyclerView.setHasFixedSize(true);
viewModel.getAllNotes().observe(this, adapter::setList);
ActivityResultLauncher<Intent> resultLauncher =registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
result -> {
if(result.getResultCode() == Activity.RESULT_OK){
String title =result.getData().getStringExtra(MainActivity2.EXTRA_TITLE_NOTE);
String description =result.getData().getStringExtra(MainActivity2.EXTRA_DESCRIPTION_NOTE);
int priority = result.getData().getIntExtra(MainActivity2.EXTRA_PRIORITY_NOTE, 1);
Note note = new Note(title, description, priority);
viewModel.insertNote(note);
Toast.makeText(this, "Note Saved", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "Note not saved", Toast.LENGTH_SHORT).show();
}
});
mainBinding.addFab.setOnClickListener(v -> {
resultLauncher.launch(new Intent(MainActivity.this, MainActivity2.class));
});
}
}
MainActivity2
public class MainActivity2 extends AppCompatActivity {
public static final String EXTRA_TITLE_NOTE = "title";
public static final String EXTRA_DESCRIPTION_NOTE = "description";
public static final String EXTRA_PRIORITY_NOTE = "1";
private ActivityMain2Binding mainBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mainBinding = ActivityMain2Binding.inflate(getLayoutInflater());
setContentView(mainBinding.getRoot());
getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_close);
mainBinding.numPicker.setMinValue(0);
mainBinding.numPicker.setMaxValue(10);
setTitle("Add Note");
}
private void extractInputAndFinish() {
String title = mainBinding.editTitle.getText().toString();
String description = mainBinding.editDescription.getText().toString();
int priority = mainBinding.numPicker.getValue();
Intent data = new Intent(this, MainActivity.class);
data.putExtra(EXTRA_TITLE_NOTE, title);
data.putExtra(EXTRA_DESCRIPTION_NOTE, description);
data.putExtra(EXTRA_PRIORITY_NOTE, priority);
setResult(Activity.RESULT_OK, data);
finish();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.note_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case R.id.note_save:
extractInputAndFinish();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
备注
@Entity(tableName = "note_table")
public class Note {
private String title;
private String description;
private int priority;
@PrimaryKey(autoGenerate = true)
private int id;
public Note(String title, String description, int priority) {
this.title = title;
this.description = description;
this.priority = priority;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public String getDescription() {
return description;
}
public int getPriority() {
return priority;
}
public int getId() {
return id;
}
}
NoteDao
@Dao
interface NoteDao {
@Insert
void insertNote(Note note);
@Update
void updateNote(Note note);
@Delete
void deleteNote(Note note);
@Query("DELETE FROM note_table")
void deleteALlNotes();
@Query("SELECT * FROM note_table ORDER BY id ")
LiveData<List<Note>> getAllNotes();
}
笔记数据库
@Database(entities = {Note.class}, version = 1)
public abstract class NoteDatabase extends RoomDatabase{
public static NoteDatabase instance;
public abstract NoteDao getDao();
public static synchronized NoteDatabase createDatabase(Context context){
if(instance == null){
instance = Room.databaseBuilder(context.getApplicationContext(),
NoteDatabase.class, "file"
)
.fallbackToDestructiveMigration()
.addCallback(callback)
.build();
}
return instance;
}
public static RoomDatabase.Callback callback = new Callback() {
@Override
public void onCreate(@NonNull @NotNull SupportSQLiteDatabase db) {
super.onCreate(db);
new Thread(() ->{
for (int i = 0; i < 3; i++) {
instance.getDao().insertNote(new Note("title " + i,
"description " + i, new Random().nextInt(10)));
}
}).start();
}
};
}
笔记库
public class NoteRepository {
private NoteDao dao;
private LiveData<List<Note>> allNotes;
public NoteRepository(Application application) {
NoteDatabase database = NoteDatabase.createDatabase(application);
dao = database.getDao();
allNotes = dao.getAllNotes();
}
public void insertNote(Note note){
new Thread(() -> dao.insertNote(note));
}
public void updateNote(Note note){
new Thread(() -> dao.updateNote(note));
}
public void deleteNote(Note note){
new Thread(() -> dao.deleteNote(note));
}
public void deleteAllNote(){
new Thread(() -> dao.deleteALlNotes());
}
public LiveData<List<Note>> getAllNotes() {
return allNotes;
}
}
NoteViewModel
public class NoteViewModel extends AndroidViewModel{
private NoteRepository repository;
private LiveData<List<Note>> allNotes;
public NoteViewModel(Application application) {
super(application);
repository = new NoteRepository(application);
allNotes = repository.getAllNotes();
}
public LiveData<List<Note>> getAllNotes() {
return allNotes;
}
public void insertNote(Note note){
repository.insertNote(note);
}
public void deleteNote(Note note){
repository.deleteNote(note);
}
public void updateNote(Note note){
repository.updateNote(note);
}
public void deleteAllNotes(){
repository.deleteAllNote();
}
}
NoteAdapter
public class NoteAdapter extends RecyclerView.Adapter<NoteAdapter.NoteViewHolder> {
private List<Note> list = new ArrayList<>();
public void setList(List<Note> list) {
this.list = list;
notifyDataSetChanged();
}
public List<Note> getList() {
return list;
}
@NonNull
@NotNull
@Override
public NoteViewHolder onCreateViewHolder(@NonNull @NotNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.example_note,
parent, false);
return new NoteViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull @NotNull NoteViewHolder holder, int position) {
Note current = list.get(position);
holder.title.setText(current.getTitle());
holder.description.setText(current.getDescription());
holder.priority.setText(String.valueOf(current.getPriority()));
}
@Override
public int getItemCount() {
return list.size();
}
public static class NoteViewHolder extends RecyclerView.ViewHolder {
private TextView title;
private TextView description;
private TextView priority;
public NoteViewHolder(@NonNull @NotNull View itemView) {
super(itemView);
title = itemView.findViewById(R.id.note_title);
description = itemView.findViewById(R.id.note_desc);
priority = itemView.findViewById(R.id.note_priority);
}
}
}
我已经尽我最大的能力阅读了这些文件,但对我来说似乎没有任何问题(我还是个新手)。
提前致谢
您无处告诉适配器新项目已添加到列表中,因此回收站视图不会更新。尝试这样做,
public class MainActivity<O> extends AppCompatActivity {
private ActivityMainBinding mainBinding;
private NoteViewModel viewModel;
private List<Note> mList;
private NoteAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mainBinding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(mainBinding.getRoot());
viewModel =new ViewModelProvider(this).get(NoteViewModel.class);
adapter = new NoteAdapter();
mainBinding.recyclerView.setAdapter(adapter);
mainBinding.recyclerView.setLayoutManager(new LinearLayoutManager(this));
mainBinding.recyclerView.setHasFixedSize(true);
viewModel.getAllNotes().observe(this, this::setList);
ActivityResultLauncher<Intent> resultLauncher =registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
result -> {
if(result.getResultCode() == Activity.RESULT_OK){
String title =result.getData().getStringExtra(MainActivity2.EXTRA_TITLE_NOTE);
String description =result.getData().getStringExtra(MainActivity2.EXTRA_DESCRIPTION_NOTE);
int priority = result.getData().getIntExtra(MainActivity2.EXTRA_PRIORITY_NOTE, 1);
Note note = new Note(title, description, priority);
viewModel.insertNote(note);
mList.add(note);
adapter.setList(mList);
Toast.makeText(this, "Note Saved", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "Note not saved", Toast.LENGTH_SHORT).show();
}
});
mainBinding.addFab.setOnClickListener(v -> {
resultLauncher.launch(new Intent(MainActivity.this, MainActivity2.class));
});
}
private void setList(List<Note> list){
mList = list;
if (adapter != null){
adapter.setList(list);
}
}
抱歉打扰你们,但我一直在关注 CodingInFlow 的 MVVM,一切顺利,直到到达第 7 个视频,我创建了两个活动:MainActivity 和 [每当我移动到MainActivity2 并输入一些数据并返回到 MainActivity,我看到没有项目被添加到 RecyclerView 但 Toasts 工作。 Ps:我是 Whosebug 的新手所以请原谅我
这是我的文件: 主要活动
public class MainActivity<O> extends AppCompatActivity {
private ActivityMainBinding mainBinding;
private NoteViewModel viewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mainBinding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(mainBinding.getRoot());
viewModel =new ViewModelProvider(this).get(NoteViewModel.class);
NoteAdapter adapter = new NoteAdapter();
mainBinding.recyclerView.setAdapter(adapter);
mainBinding.recyclerView.setLayoutManager(new LinearLayoutManager(this));
mainBinding.recyclerView.setHasFixedSize(true);
viewModel.getAllNotes().observe(this, adapter::setList);
ActivityResultLauncher<Intent> resultLauncher =registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
result -> {
if(result.getResultCode() == Activity.RESULT_OK){
String title =result.getData().getStringExtra(MainActivity2.EXTRA_TITLE_NOTE);
String description =result.getData().getStringExtra(MainActivity2.EXTRA_DESCRIPTION_NOTE);
int priority = result.getData().getIntExtra(MainActivity2.EXTRA_PRIORITY_NOTE, 1);
Note note = new Note(title, description, priority);
viewModel.insertNote(note);
Toast.makeText(this, "Note Saved", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "Note not saved", Toast.LENGTH_SHORT).show();
}
});
mainBinding.addFab.setOnClickListener(v -> {
resultLauncher.launch(new Intent(MainActivity.this, MainActivity2.class));
});
}
}
MainActivity2
public class MainActivity2 extends AppCompatActivity {
public static final String EXTRA_TITLE_NOTE = "title";
public static final String EXTRA_DESCRIPTION_NOTE = "description";
public static final String EXTRA_PRIORITY_NOTE = "1";
private ActivityMain2Binding mainBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mainBinding = ActivityMain2Binding.inflate(getLayoutInflater());
setContentView(mainBinding.getRoot());
getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_close);
mainBinding.numPicker.setMinValue(0);
mainBinding.numPicker.setMaxValue(10);
setTitle("Add Note");
}
private void extractInputAndFinish() {
String title = mainBinding.editTitle.getText().toString();
String description = mainBinding.editDescription.getText().toString();
int priority = mainBinding.numPicker.getValue();
Intent data = new Intent(this, MainActivity.class);
data.putExtra(EXTRA_TITLE_NOTE, title);
data.putExtra(EXTRA_DESCRIPTION_NOTE, description);
data.putExtra(EXTRA_PRIORITY_NOTE, priority);
setResult(Activity.RESULT_OK, data);
finish();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.note_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case R.id.note_save:
extractInputAndFinish();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
备注
@Entity(tableName = "note_table")
public class Note {
private String title;
private String description;
private int priority;
@PrimaryKey(autoGenerate = true)
private int id;
public Note(String title, String description, int priority) {
this.title = title;
this.description = description;
this.priority = priority;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public String getDescription() {
return description;
}
public int getPriority() {
return priority;
}
public int getId() {
return id;
}
}
NoteDao
@Dao
interface NoteDao {
@Insert
void insertNote(Note note);
@Update
void updateNote(Note note);
@Delete
void deleteNote(Note note);
@Query("DELETE FROM note_table")
void deleteALlNotes();
@Query("SELECT * FROM note_table ORDER BY id ")
LiveData<List<Note>> getAllNotes();
}
笔记数据库
@Database(entities = {Note.class}, version = 1)
public abstract class NoteDatabase extends RoomDatabase{
public static NoteDatabase instance;
public abstract NoteDao getDao();
public static synchronized NoteDatabase createDatabase(Context context){
if(instance == null){
instance = Room.databaseBuilder(context.getApplicationContext(),
NoteDatabase.class, "file"
)
.fallbackToDestructiveMigration()
.addCallback(callback)
.build();
}
return instance;
}
public static RoomDatabase.Callback callback = new Callback() {
@Override
public void onCreate(@NonNull @NotNull SupportSQLiteDatabase db) {
super.onCreate(db);
new Thread(() ->{
for (int i = 0; i < 3; i++) {
instance.getDao().insertNote(new Note("title " + i,
"description " + i, new Random().nextInt(10)));
}
}).start();
}
};
}
笔记库
public class NoteRepository {
private NoteDao dao;
private LiveData<List<Note>> allNotes;
public NoteRepository(Application application) {
NoteDatabase database = NoteDatabase.createDatabase(application);
dao = database.getDao();
allNotes = dao.getAllNotes();
}
public void insertNote(Note note){
new Thread(() -> dao.insertNote(note));
}
public void updateNote(Note note){
new Thread(() -> dao.updateNote(note));
}
public void deleteNote(Note note){
new Thread(() -> dao.deleteNote(note));
}
public void deleteAllNote(){
new Thread(() -> dao.deleteALlNotes());
}
public LiveData<List<Note>> getAllNotes() {
return allNotes;
}
}
NoteViewModel
public class NoteViewModel extends AndroidViewModel{
private NoteRepository repository;
private LiveData<List<Note>> allNotes;
public NoteViewModel(Application application) {
super(application);
repository = new NoteRepository(application);
allNotes = repository.getAllNotes();
}
public LiveData<List<Note>> getAllNotes() {
return allNotes;
}
public void insertNote(Note note){
repository.insertNote(note);
}
public void deleteNote(Note note){
repository.deleteNote(note);
}
public void updateNote(Note note){
repository.updateNote(note);
}
public void deleteAllNotes(){
repository.deleteAllNote();
}
}
NoteAdapter
public class NoteAdapter extends RecyclerView.Adapter<NoteAdapter.NoteViewHolder> {
private List<Note> list = new ArrayList<>();
public void setList(List<Note> list) {
this.list = list;
notifyDataSetChanged();
}
public List<Note> getList() {
return list;
}
@NonNull
@NotNull
@Override
public NoteViewHolder onCreateViewHolder(@NonNull @NotNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.example_note,
parent, false);
return new NoteViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull @NotNull NoteViewHolder holder, int position) {
Note current = list.get(position);
holder.title.setText(current.getTitle());
holder.description.setText(current.getDescription());
holder.priority.setText(String.valueOf(current.getPriority()));
}
@Override
public int getItemCount() {
return list.size();
}
public static class NoteViewHolder extends RecyclerView.ViewHolder {
private TextView title;
private TextView description;
private TextView priority;
public NoteViewHolder(@NonNull @NotNull View itemView) {
super(itemView);
title = itemView.findViewById(R.id.note_title);
description = itemView.findViewById(R.id.note_desc);
priority = itemView.findViewById(R.id.note_priority);
}
}
}
我已经尽我最大的能力阅读了这些文件,但对我来说似乎没有任何问题(我还是个新手)。
提前致谢
您无处告诉适配器新项目已添加到列表中,因此回收站视图不会更新。尝试这样做,
public class MainActivity<O> extends AppCompatActivity {
private ActivityMainBinding mainBinding;
private NoteViewModel viewModel;
private List<Note> mList;
private NoteAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mainBinding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(mainBinding.getRoot());
viewModel =new ViewModelProvider(this).get(NoteViewModel.class);
adapter = new NoteAdapter();
mainBinding.recyclerView.setAdapter(adapter);
mainBinding.recyclerView.setLayoutManager(new LinearLayoutManager(this));
mainBinding.recyclerView.setHasFixedSize(true);
viewModel.getAllNotes().observe(this, this::setList);
ActivityResultLauncher<Intent> resultLauncher =registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
result -> {
if(result.getResultCode() == Activity.RESULT_OK){
String title =result.getData().getStringExtra(MainActivity2.EXTRA_TITLE_NOTE);
String description =result.getData().getStringExtra(MainActivity2.EXTRA_DESCRIPTION_NOTE);
int priority = result.getData().getIntExtra(MainActivity2.EXTRA_PRIORITY_NOTE, 1);
Note note = new Note(title, description, priority);
viewModel.insertNote(note);
mList.add(note);
adapter.setList(mList);
Toast.makeText(this, "Note Saved", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "Note not saved", Toast.LENGTH_SHORT).show();
}
});
mainBinding.addFab.setOnClickListener(v -> {
resultLauncher.launch(new Intent(MainActivity.this, MainActivity2.class));
});
}
private void setList(List<Note> list){
mList = list;
if (adapter != null){
adapter.setList(list);
}
}