问题描述
我最近了解了 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());
}
});
}
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());
}
});
}