如何解决RecylerView 不会删除最后一项
我有一个连接到回收站视图的列表适配器。我使用调用 deleteItem()
的 SwipToDelete。
如果我删除一个项目,回收者视图中的列表条目将被删除。
问题:如果回收站视图中只有一项并且我尝试将其删除,则列表条目在回收站视图中仍然可见。但是只要重新启动应用程序它就消失了。
我认为 notifyItemRemoved()
应该处理它,就像有多个项目一样。
RepoListAdapter:
public class RepoListAdapter extends ListAdapter<Repo,RepoViewHolder> {
private RecyclerView recyclerView;
public RepoListAdapter(@NonNull DiffUtil.ItemCallback<Repo> diffCallback) {
super(diffCallback);
}
@NonNull @Override
public RepoViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup,int viewType) {
return RepoViewHolder.create(viewGroup);
}
@Override
public void onBindViewHolder(RepoViewHolder holder,int position) {
Repo current = getItem(position);
holder.bind(current.getName());
}
public static class RepoDiff extends DiffUtil.ItemCallback<Repo> {
@Override
public boolean areItemsTheSame(@NonNull Repo oldItem,@NonNull Repo newItem) {
return oldItem == newItem;
}
@Override
public boolean areContentsTheSame(@NonNull Repo oldItem,@NonNull Repo newItem) {
return oldItem.getName().equals(newItem.getName());
}
}
@Override
public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
this.recyclerView = recyclerView;
}
public Context getContext() {
return recyclerView.getContext();
}
public void deleteItem(int position) {
Repo recentlyDeletedRepo = getItem(position);
RepoViewModel repoViewModel = new ViewModelProvider((ViewModelStoreOwner) getContext()).get(RepoViewModel.class);
repoViewModel.delete(recentlyDeletedRepo);
notifyItemRemoved(position);
notifyItemRangeRemoved(position,1);
Snackbar snackbar = Snackbar.make(recyclerView,R.string.snackbar_undo,Snackbar.LENGTH_LONG);
snackbar.setAction(R.string.snackbar_undo,v -> undoDelete(recentlyDeletedRepo,position));
snackbar.show();
}
private void undoDelete(Repo recentlyDeletedRepo,int position) {
RepoViewModel repoViewModel = new ViewModelProvider((ViewModelStoreOwner) getContext()).get(RepoViewModel.class);
repoViewModel.insert(recentlyDeletedRepo);
notifyItemInserted(position);
}
}
RepoViewModel:
public class RepoViewModel extends AndroidViewModel {
private final RepoRepository repoRepository;
private final LiveData<List<Repo>> allRepos;
private Repo currentRepo;
public RepoViewModel(Application application) {
super(application);
repoRepository = new RepoRepository(application);
allRepos = repoRepository.getAllRepos();
}
public Repo getCurrentRepo() {
return currentRepo;
}
public void setCurrentRepo(Repo currentRepo) {
this.currentRepo = currentRepo;
}
public LiveData<Repo> getRepoById(int id) {
return repoRepository.getRepoById(id);
}
public LiveData<List<Repo>> getAllRepos() {
return allRepos;
}
public long insert(Repo repo) {
return repoRepository.insert(repo);
}
public void update(Repo repo) {
repoRepository.update(repo);
}
public void delete(Repo repo) {
repoRepository.delete(repo);
}
}
项目片段:
public class ProjectsFragment extends Fragment {
private RecyclerView recyclerView;
private TextView textview_no_project;
private RepoListAdapter repoListAdapter;
@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
FloatingActionButton floatingActionButton = ((MainActivity) requireActivity()).getFloatingActionButton();
floatingActionButton.setVisibility(View.VISIBLE);
return inflater.inflate(R.layout.fragment_projects,container,false);
}
public void onViewCreated(@NonNull View view,Bundle savedInstanceState) {
super.onViewCreated(view,savedInstanceState);
textview_no_project = view.findViewById(R.id.textview_no_project);
repoListAdapter = new RepoListAdapter(new RepoListAdapter.RepoDiff());
recyclerView = view.findViewById(R.id.recyclerview);
recyclerView.setLayoutManager(new LinearLayoutManager(requireActivity()));
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(),DividerItemDecoration.VERTICAL);
recyclerView.addItemDecoration(dividerItemDecoration);
recyclerView.setAdapter(repoListAdapter);
ItemTouchHelper itemTouchHelper = new
ItemTouchHelper(new SwipeToDeleteCallback(repoListAdapter));
itemTouchHelper.attachToRecyclerView(recyclerView);
RepoViewModel repoViewModel = new ViewModelProvider(requireActivity()).get(RepoViewModel.class);
repoViewModel.getAllRepos().observe(getViewLifecycleOwner(),this::onLoaded);
}
private void onLoaded(List<Repo> list){
if (list.size() == 0) {
textview_no_project.setVisibility(View.VISIBLE);
}
else {
textview_no_project.setVisibility(View.INVISIBLE);
repoListAdapter.submitList(list);
}
}
}
解决方法
试试notifyDataSetChanged();在您的适配器中
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。