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);
    }
}