Java LiveData的变化<;列表<;Obj>&燃气轮机;不是';t显示在recyclerView中,该视图在LiveData上下标<;列表>;

Java LiveData的变化<;列表<;Obj>&燃气轮机;不是';t显示在recyclerView中,该视图在LiveData上下标<;列表>;,java,android,android-recyclerview,android-livedata,android-viewmodel,Java,Android,Android Recyclerview,Android Livedata,Android Viewmodel,单击某个项目时,OnItemListener.onItemClick(请参见适配器代码中的)工作,并删除 分别来自LiveData mListLivedata(请参见ViewModel中的)。 问题是,尽管存在 订阅此LiveData的观察者。recyclerView中仍有4个视图,但如果 如果我单击视图中的最后一个项目(在之前已单击任何项目之后), 它崩溃是因为Livedata中的一个对象已经减少了(因为上一次单击已停止) 删除一个对象)。因此,单击后LiveData中的对象数减少了一个(这是

单击某个项目时,OnItemListener.onItemClick(请参见适配器代码中的)工作,并删除 分别来自LiveData mListLivedata(请参见ViewModel中的)。 问题是,尽管存在 订阅此LiveData的观察者。recyclerView中仍有4个视图,但如果 如果我单击视图中的最后一个项目(在之前已单击任何项目之后), 它崩溃是因为Livedata中的一个对象已经减少了(因为上一次单击已停止) 删除一个对象)。因此,单击后LiveData中的对象数减少了一个(这是 是我所需要的),但视图中的项目数量保持不变(这是错误,我不理解) 我的错误在哪里)。 我的错误在哪里?解决方法是什么

在ViewModel中:

public class PersonViewModel extends AndroidViewModel {
    private PersonRepository mRepository;
    private CompositeDisposable composite = new CompositeDisposable();
    private Single<List<Person>> mThreePersons;
    private ArrayList<Person> mList = new ArrayList<>();
    private MutableLiveData<List<Person>> mListLivedata = new MutableLiveData<>();

    public PersonViewModel(@NonNull Application application) {
        super(application);
        mRepository = new PersonRepository(application);
        mThreePersons = mRepository.getThreePersons();
        mThreePersons.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new SingleObserver<List<Person>>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        Log.d(TAG, "onSubscribe(Disposable d): called");
                        composite.add(d);
                    }

                    @Override
                    public void onSuccess(List<Person> people) {
                        Log.d(TAG, "onSuccess: called");
                        mList.addAll(people);
                        mListLivedata.setValue(mList);
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.d(TAG, "onError: called");
                        Toast.makeText(application, "NO DATA", Toast.LENGTH_SHORT).show();
                    }
                });
    }

    LiveData<List<Person>> getListLivedata() {
        return mListLivedata;
    }

    public void removePerson(Person person) {
        mList.remove(person);
        mListLivedata.setValue(mList);
        Log.d(TAG, "removePerson: called");
    }
}
在适配器中:

public class PersonRecyclerAdapter extends ListAdapter<Person, PersonRecyclerAdapter.PersonRecyclerViewHolder> {

    private OnItemListener mOnItemListener;

    public interface OnItemListener {
        void onItemClick(int position);
    }

    protected PersonRecyclerAdapter(@NonNull DiffUtil.ItemCallback<Person> diffCallback, OnItemListener onItemListener) {
        super(diffCallback);
        mOnItemListener = onItemListener;
    }

    public class PersonRecyclerViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        private final TextView mrName;
        private final TextView mrStatus;
        OnItemListener onItemListener;

        public PersonRecyclerViewHolder(@NonNull View itemView, OnItemListener onItemListener) {
            super(itemView);
            mrName = itemView.findViewById(R.id.tv_rec_name);
            mrStatus = itemView.findViewById(R.id.tv_rec_status);
            this.onItemListener = onItemListener;

            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            onItemListener.onItemClick(getAdapterPosition());
        }
    }

    public Person getPersonAt(int position) {
        return getItem(position);
    }

    @NonNull
    @Override
    public MudakRecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.recycler_simple_item, parent, false);
        return new MudakRecyclerAdapter.MudakRecyclerViewHolder(view, mOnItemListener);
    }

    @Override
    public void onBindViewHolder(@NonNull MudakRecyclerViewHolder holder, int position) {
        Person currentPerson = getItem(position);
        holder.mrName.setText(currentPerson.getName());
        holder.mrStatus.setText(currentPerson.getStatus());
    }

    static class PersonRecyclerDiff extends DiffUtil.ItemCallback<Person> {

        @Override
        public boolean areItemsTheSame(@NonNull Person oldItem, @NonNull Person newItem) {
            return oldItem == newItem;
        }

        @Override
        public boolean areContentsTheSame(@NonNull Person oldItem, @NonNull Person newItem) {
            return oldItem.getName().equals(newItem.getName());
        }
    }
}
公共类PersonRecyclerAdapter扩展ListAdapter{
私人监听者监听者;
公共接口侦听器{
无效单击(内部位置);
}
受保护的PersonRecyclerAdapter(@NonNull DiffUtil.ItemCallback diffCallback,OnItemListener OnItemListener){
超级(diffCallback);
monitemstener=onItemListener;
}
公共类PersonRecycleServiceWholder扩展了RecycleView.ViewHolder实现了View.OnClickListener{
私有最终文本视图名称;
私有最终文本视图状态;
奥涅姆利斯滕纳奥涅姆利斯滕纳;
public PersonRecycleServiceWholder(@NonNull视图项视图,OnItemListener-OnItemListener){
超级(项目视图);
mrName=itemView.findviewbyd(R.id.tv\u rec\u name);
mrStatus=itemView.findviewbyd(R.id.tv\u rec\u status);
this.onItemListener=onItemListener;
setOnClickListener(这个);
}
@凌驾
公共void onClick(视图v){
onItemListener.onItemClick(getAdapterPosition());
}
}
公众人物getPersonAt(内部职位){
返回项目(位置);
}
@非空
@凌驾
public MudakRecycleServiceWholder onCreateViewHolder(@NonNull ViewGroup父级,int-viewType){
View=LayoutInflater.from(parent.getContext())
.充气(R.layout.recycler\u simple\u项目,父项,错误);
返回新的MudakRecyclerAdapter.MudakRecyclerServiceWholder(视图,MonitorListener);
}
@凌驾
BindViewHolder上的公共void(@NonNull MudakRecycleServiceWholder holder,int位置){
Person currentPerson=getItem(职位);
holder.mrName.setText(currentPerson.getName());
holder.mrStatus.setText(currentPerson.getStatus());
}
静态类PersonRecyclerDiff扩展了DiffUtil.ItemCallback{
@凌驾
公共布尔值AreItemsSame(@NonNull Person oldItem,@NonNull Person newItem){
返回oldItem==newItem;
}
@凌驾
公共布尔值是相同的内容(@NonNull Person oldItem,@NonNull Person newItem){
返回oldItem.getName().equals(newItem.getName());
}
}
}

如果您向ListAdapter提交它以前使用的相同列表实例,ListAdapter将不会做任何事情,因为它旨在比较两个不同列表之间的差异。您应该让
removePerson()
方法创建一个新的列表实例,其中删除了项,并将其传递给LiveData

例如:

    public void removePerson(Person person) {
        mList = new ArrayList(mList); // create a new list with same contents
        mList.remove(person); // remove the item from the new list.
        mListLivedata.setValue(mList);
        Log.d(TAG, "removePerson: called");
    }

谢谢你的帮助。它必须是一个同名的列表mList?或者removePerson()应该是什么样子?。列表没有名称
mList
是指向特定列表的成员变量的名称。当您将列表实例传递给不同的方法时,它们都不知道哪些变量可能从其他地方引用它。无论如何,我添加了一个示例,说明
removePerson()
可以是什么样子。
    public void removePerson(Person person) {
        mList = new ArrayList(mList); // create a new list with same contents
        mList.remove(person); // remove the item from the new list.
        mListLivedata.setValue(mList);
        Log.d(TAG, "removePerson: called");
    }