添加新项目后 RecyclerView ListAdapter 不更新

问题描述

我最近了解了 listadapter 并应用于我的 RecyclerView。我遵循了一个教程,项目列表(通过改造从数据库中检索)按预期显示。但是,当我添加新项目时,除非我离开活动并返回,否则列表不会更新。我在这里错过了什么?

视图模型

public class Noteviewmodel extends viewmodel {

private static final String TAG = "Noteviewmodel";
mutablelivedata<List<Note>> mutablelivedata;

public LiveData<List<Note>> getNoteList(String userID) {
    if (mutablelivedata == null) {
        mutablelivedata = new mutablelivedata<>();
    }
    initNoteList(userID);
    return mutablelivedata;
}

private void initNoteList(String userID) {
    List<Note> noteList = new ArrayList<>();
    Call<List<Note>> noteCall = apiclient.getUserService().retrieveUserNotes(userID);
    noteCall.enqueue(new Callback<List<Note>>() {
        @Override
        public void onResponse(Call<List<Note>> call,Response<List<Note>> response) {
            if (response.isSuccessful()) {
                if (response.body() != null) {
                    noteList.addAll(response.body());
                    mutablelivedata.setValue(noteList);
                    Log.d(TAG,"onResponse: " + noteList.size());
                } else {
                    Log.d(TAG,"onResponse: Retrieve Note List Body Error");
                }
            } else {
                Log.d(TAG,"onResponse: Response Fail");
            }
        }

        @Override
        public void onFailure(Call<List<Note>> call,Throwable t) {
            Log.d(TAG,"onFailure: Retrieve Note List Failure: " + t.getMessage());
        }
    });
}

listadapter

public class Notelistadapter extends listadapter<Note,Notelistadapter.NoteViewHolder> {

NoteClickListener noteClickListener;

public Notelistadapter(@NonNull DiffUtil.ItemCallback<Note> diffCallback,NoteClickListener noteClickListener) {
    super(diffCallback);
    this.noteClickListener = noteClickListener;
}

@NonNull
@Override
public NoteViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.note_item,parent,false);
    return new NoteViewHolder(v,noteClickListener);
}

@Override
public void onBindViewHolder(@NonNull NoteViewHolder holder,int position) {
    Note note = getItem(position);
    assert note != null;
    holder.bind(note);
}

public static class NoteViewHolder extends RecyclerView.ViewHolder {

    NoteClickListener noteClickListener;
    TextView noteTitle;

    public NoteViewHolder(View itemView,NoteClickListener noteClickListener) {
        super(itemView);
        this.noteClickListener = noteClickListener;
        noteTitle = itemView.findViewById(R.id.note_title);
        itemView.setonClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                noteClickListener.onNoteClick(getAbsoluteAdapterPosition());
            }
        });

    public void bind(Note note) {
        noteTitle.setText(note.getTitle());
    }
}

public interface NoteClickListener {
    void onNoteClick(int position);
    void onNoteLongClick(int position);
}

活动

public class NotesList extends AppCompatActivity {

private final String TAG = getClass().getSimpleName();
Toolbar toolbar;
FloatingActionButton addNote,deleteNote;
User user;
Notelistadapter notelistadapter;
Noteviewmodel noteviewmodel;
private static final int EDIT_NOTE = 10001;
private static final int SAVE_NOTE = 10002;
private boolean reloadNotes = false;
List<Note> noteList;
RecyclerView recyclerView;

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

    Intent notes = getIntent();
    user = (User) notes.getParcelableExtra("user");

    addNote = findViewById(R.id.fab_notes);
    deleteNote = findViewById(R.id.delete_notes);

    deleteNote.setVisibility(View.GONE);

    toolbar = findViewById(R.id.toolbar);
    toolbar.setNavigationIcon(R.drawable.ic_baseline_arrow_back_24);
    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            NotesList.this.onBackpressed();
        }
    });

    if (getSupportActionBar() != null) {
        getSupportActionBar().hide();
    }

    addNote.setonClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent newNote = new Intent(NotesList.this,createuserNote.class);
            newNote.putExtra("user",user);
            NotesList.this.startActivity(newNote);
        }
    });
    recyclerView = findViewById(R.id.notesRecyclerView);
    notelistadapter = new Notelistadapter(Note.itemCallback,new Notelistadapter.NoteClickListener() {
        @Override
        public void onNoteClick(int position) {
            // Todo: Edit Note
            Toast.makeText(NotesList.this,notelistadapter.getCurrentList().get(position).getTitle(),Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onNoteLongClick(int position) {
            // Todo: Delete Note
        }
    });
    recyclerView.setAdapter(notelistadapter);
    noteviewmodel = new viewmodelProvider(this).get(Noteviewmodel.class);
    noteviewmodel.getNoteList(user.getUser_id()).observe(NotesList.this,new Observer<List<Note>>() {
        @Override
        public void onChanged(List<Note> notes) {
            notelistadapter.submitList(notes);
        }
    });

}

解决方法

我找到了一种解决方法,即在添加新项目后在 submitList() 中调用 onActivityResult()。但是,我想知道这是否是好的编程。

这是我添加的内容:

    @Override
protected void onActivityResult(int requestCode,int resultCode,@Nullable Intent data) {
    super.onActivityResult(requestCode,resultCode,data);

    if (requestCode == SAVE_NOTE) {
        if (resultCode == CreateUserNote.RESULT_OK) {
            noteListAdapter.submitList(noteViewModel.getNoteList(user.getUser_id()).getValue());
        }
    }
}

更改了以下内容:

        addNote.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent newNote = new Intent(NotesList.this,CreateUserNote.class);
            newNote.putExtra("user",user);
            NotesList.this.startActivityForResult(newNote,SAVE_NOTE);
        }
    });

创建新的项目活动改造调用:

 private void saveNote(String user_id,String title,String content) {
    Call<String> noteCall = APIClient.getUserService().addUserNote(user_id,title,content);
    noteCall.enqueue(new Callback<String>() {
        @Override
        public void onResponse(Call<String> call,Response<String> response) {
            if (response.isSuccessful()) {
                if (response.body() != null) {
                    if (response.body().equals("true")) {
                        setResult(CreateUserNote.RESULT_OK);
                        finish();
                    } else {
                        Toast.makeText(CreateUserNote.this,"Save User Note Failure",Toast.LENGTH_SHORT).show();
                    }
                }
            }
        }

        @Override
        public void onFailure(Call<String> call,Throwable t) {
            Toast.makeText(CreateUserNote.this,"Save User Note Failure: " + t.getMessage(),Toast.LENGTH_SHORT).show();
            Log.w("Error","Save User Note Failure: " + t.getMessage());
        }
    });
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...