Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 带有RecyclerView的RecyclerView。当超过1项时适配器不更新_Android_Android Recyclerview - Fatal编程技术网

Android 带有RecyclerView的RecyclerView。当超过1项时适配器不更新

Android 带有RecyclerView的RecyclerView。当超过1项时适配器不更新,android,android-recyclerview,Android,Android Recyclerview,我有一个带有RecyclerView适配器的RecyclerView,它只在只有一个孩子的情况下更新,而有两个或更多孩子的情况下不更新信息。要显示正确的信息,我需要关闭然后重新打开应用程序 通过调试器进行检查,发现在更新数据时,正确和完整的信息确实到达onBindViewHolder方法,但即使在调用notifyDataSetChanged时,也不会更新UI,代码如下: 这是适配器和recyclerview初始化的时间: LinearLayoutManager layoutManag

我有一个带有RecyclerView适配器的RecyclerView,它只在只有一个孩子的情况下更新,而有两个或更多孩子的情况下不更新信息。要显示正确的信息,我需要关闭然后重新打开应用程序

通过调试器进行检查,发现在更新数据时,正确和完整的信息确实到达onBindViewHolder方法,但即使在调用notifyDataSetChanged时,也不会更新UI,代码如下:

这是适配器和recyclerview初始化的时间:

      LinearLayoutManager layoutManagerForServers = new LinearLayoutManager(getContext());
        recyclerViewServers.setLayoutManager(layoutManagerForServers);
        mainArrayListForServers = new ArrayList<>();
        mAdapterForServers = new ViewServersAdapter(getContext());
        recyclerViewServers.setAdapter(mAdapterForServers);
LinearLayoutManager布局管理器forserver=newlinearlayoutmanager(getContext());
setLayoutManager(layoutManagerForServers);
mainArrayListForServers=新建ArrayList();
mAdapterForServers=newviewserversadapter(getContext());
setAdapter(mAdapterForServers);
这是数据更新的时间:

   final ViewModelForServers viewModel = new ViewModelProvider(this).get(ViewModelForServers.class);
    final LiveData<ArrayList<Server>> liveData = viewModel.getServersMediatorLiveData();

    liveData.observe(this, new Observer<ArrayList<Server>>() {
        @Override
        public void onChanged(@Nullable ArrayList<Server> serverArrayList) {
            if (serverArrayList != null) {
                mainArrayListForServers = serverArrayList;
                // update the UI here with values in the snapshot
                mAdapterForServers.setServersArrayList(mainArrayListForServers);
                mAdapterForServers.notifyDataSetChanged();
                setEmptyView();

            }
        }
    });
final ViewModelForServers viewModel=new ViewModelProvider(this.get)(viewmodelforserver.class);
final LiveData LiveData=viewModel.getserversmeditorlivedata();
liveData.observe(这个,新的观察者(){
@凌驾
更改后的公共void(@Nullable ArrayList serverArrayList){
如果(serverArrayList!=null){
mainArrayListForServers=serverArrayList;
//使用快照中的值更新此处的UI
mAdapterForServers.setServersArrayList(mainArrayListForServers);
mAdapterForServers.notifyDataSetChanged();
setEmptyView();
}
}
});
最后是回收器适配器:

public class ViewServersAdapter extends RecyclerView.Adapter<ViewServersAdapter.MyViewHolder> {
private ArrayList<Server> serversArrayList = new ArrayList<>();
private ViewServersFragmentItemBinding viewServersFragmentItemBinding;
private Context context;

ViewServersAdapter(Context context){
    this.context = context;
}

static class MyViewHolder extends RecyclerView.ViewHolder{
    Context context;

    MyViewHolder(@NonNull View itemView, Context context) {
        super(itemView);
        this.context = context;
    }

    void bindView(Server server, ViewServersFragmentItemBinding viewQFragmentItemBinding){

        TextView serverNameTxt = viewQFragmentItemBinding.serverName;
        TextView serverStatus = viewQFragmentItemBinding.serverStatus;
        TextView serverNumber = viewQFragmentItemBinding.serverNumber;
        TextView userOnCall = viewQFragmentItemBinding.userOnCall;
        TextView duration = viewQFragmentItemBinding.callDuration;
        ImageView userProfile = viewQFragmentItemBinding.profilePicture;


        serverNameTxt.setText(server.getServerName());
        serverStatus.setText(Utils.getServerStatus(server.getServerStatus(),context));
        serverNumber.setText(String.valueOf(server.getServerNumber()).substring(3));
        if (server.getCallRequest()!= null){
            userOnCall.setText(server.getCallRequest().getUser());
            duration.setText(Utils.getTimeOnMinutes(server.getCallRequest().getTime(),context,false));
            Uri profilePictureUri = Uri.parse(server.getCallRequest().getProfilePicture());
            userProfile.setScaleX(1);
            userProfile.setImageResource(ListOfProfilePictureSmallsInt.get(Utils.getPhotoUrlIndex(profilePictureUri)));
        } else {
            userOnCall.setText("");
            duration.setText("");
            userProfile.setScaleX(-1);
            userProfile.setImageResource(R.drawable.ic_waiting);
        }

    }
}


void setServersArrayList(ArrayList<Server> serverArrayList){
   this.serversArrayList = serverArrayList;
}

@NonNull
@Override
public ViewServersAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());
    viewServersFragmentItemBinding = ViewServersFragmentItemBinding.inflate(inflater,parent,false);
    // create a new view
    ConstraintLayout v = (ConstraintLayout) viewServersFragmentItemBinding.getRoot();
    RecyclerView.LayoutParams lp = new RecyclerView.LayoutParams(
            ViewGroup.LayoutParams.MATCH_PARENT, //width
            ViewGroup.LayoutParams.WRAP_CONTENT);//height
    v.setLayoutParams(lp);//override default layout params

    return new MyViewHolder(v, context);
}

@Override
public void onBindViewHolder(@NonNull ViewServersAdapter.MyViewHolder holder, int position) {
    Server server = serversArrayList.get(position);
    holder.bindView(server, viewServersFragmentItemBinding);
}

@Override
public int getItemCount() {
    return serversArrayList.size();
}
公共类ViewServersAdapter扩展了RecyclerView.Adapter{
private ArrayList serversArrayList=new ArrayList();
私有ViewServersFragmentItemBinding ViewServersFragmentItemBinding;
私人语境;
ViewServersAdapter(上下文){
this.context=上下文;
}
静态类MyViewHolder扩展了RecyclerView.ViewHolder{
语境;
MyViewHolder(@NonNull视图项视图,上下文){
超级(项目视图);
this.context=上下文;
}
void bindView(服务器,ViewServersFragmentItemBinding视图QFragmentItemBinding){
TextView serverNameTxt=viewQFragmentItemBinding.serverName;
TextView serverStatus=viewQFragmentItemBinding.serverStatus;
TextView serverNumber=viewQFragmentItemBinding.serverNumber;
TextView userOnCall=viewQFragmentItemBinding.userOnCall;
TextView duration=viewQFragmentItemBinding.callDuration;
ImageView userProfile=viewQFragmentItemBinding.profilePicture;
serverNameTxt.setText(server.getServerName());
setText(Utils.getServerStatus(server.getServerStatus(),context));
setText(String.valueOf(server.getServerNumber()).substring(3));
if(server.getCallRequest()!=null){
userOnCall.setText(server.getCallRequest().getUser());
duration.setText(Utils.getTimeOnMinutes(server.getCallRequest().getTime(),context,false));
Uri profilePictureUri=Uri.parse(server.getCallRequest().getProfilePicture());
userProfile.setScaleX(1);
userProfile.setImageResource(profilePictureSallsint.get(Utils.getPhotoUrlIndex(profilePictureUri));
}否则{
userOnCall.setText(“”);
持续时间。setText(“”);
userProfile.setScaleX(-1);
setImageResource(R.drawable.ic_waiting);
}
}
}
void setServersArrayList(ArrayList服务器ArrayList){
this.serversArrayList=serverArrayList;
}
@非空
@凌驾
public ViewServersAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup父级,int-viewType){
LayoutInflater充气器=LayoutInflater.from(parent.getContext());
viewServersFragmentItemBinding=viewServersFragmentItemBinding.充气(充气器,父项,false);
//创建新视图
ConstraintLayout v=(ConstraintLayout)viewServersFragmentItemBinding.getRoot();
RecyclerView.LayoutParams lp=新的RecyclerView.LayoutParams(
ViewGroup.LayoutParams.MATCH_父项,//宽度
ViewGroup.LayoutParams.WRAP_CONTENT);//高度
v、 setLayoutParams(lp);//覆盖默认布局参数
返回新的MyViewHolder(v,上下文);
}
@凌驾
public void onBindViewHolder(@NonNull ViewServersAdapter.MyViewHolder,int位置){
Server=serversArrayList.get(位置);
holder.bindView(服务器、viewServersFragmentItemBinding);
}
@凌驾
public int getItemCount(){
返回服务器raylist.size();
}
}


我真的很感激任何帮助。谢谢

您可以做一件事,在适配器类中添加一个方法,如下所示

public void updateData(ArrayList<Server> serversArrayList)
{
this.serversArrayList = serversArrayList;
notifyDataSetChanged();
}

它是否嵌套在另一个
RecyclerView
中?配置更改(屏幕旋转)后是否更新

我多次遇到相同的错误,添加新元素时,recyclerview不会更新UI,尽管所有适配器的事情都完成了。我在这里使用了一种解决方法:
mRecyclerView.scrollBy(0,1)
,请在调用
notifyDataSetChanged()
之后立即调用它

RecyclerView
实际的行为如何?它显示所有的项目吗?它们是否都更新了相同的信息?还是只是最后一个更新的项目

编辑

问题似乎不是RV没有更新UI,而是数据绑定和如何使用它。它实际上只是正确更新的最后一项吗

问题是您的
viewServersFragmentItemBinding
是在适配器类中声明的,但它应该声明并保存在viewholder类中(也是最终的)。这意味着在调用所有的
onCreateViewHolder
方法之后,只存储最后一个viewholder的数据绑定,并且所有
mAdapterForServers.updateData(serverArrayList);
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
        ViewDataBinding binding = DataBindingUtil.inflate(layoutInflater, viewType, parent, false);
        return new MyViewHolder(binding);
    }

    public void onBindViewHolder(MyViewHolder holder, int position) {
        Object obj = getObjForPosition(position);
        holder.bind(obj);
    }
public class MyViewHolder extends RecyclerView.ViewHolder {
    private final ViewDataBinding binding;

    public MyViewHolder(ViewDataBinding binding) {
        super(binding.getRoot());
        this.binding = binding;
    }

    public void bind(Object obj) {
        binding.setVariable(BR.obj, obj);
        binding.executePendingBindings();
    }
}
 LinearLayoutManager layoutManagerForServers = new LinearLayoutManager(getContext());
    recyclerViewServers.setLayoutManager(layoutManagerForServers);
    mainArrayListForServers = new ArrayList<>();
    mAdapterForServers = new ViewServersAdapter(getContext(),mainArrayListForServers);
    recyclerViewServers.setAdapter(mAdapterForServers);
public class ViewServersAdapter extends RecyclerView.Adapter<ViewServersAdapter.MyViewHolder> {
private ArrayList<Server> serversArrayList;
private ViewServersFragmentItemBinding viewServersFragmentItemBinding;
private Context context;

ViewServersAdapter(Context context,ArrayList<Server> serversArrayList){
    this.context = context;
    this.serversArrayList = serversArrayList;
}

static class MyViewHolder extends RecyclerView.ViewHolder{
    Context context;

    MyViewHolder(@NonNull View itemView, Context context) {
        super(itemView);
        this.context = context;
    }

    void bindView(Server server, ViewServersFragmentItemBinding viewQFragmentItemBinding){

        TextView serverNameTxt = viewQFragmentItemBinding.serverName;
        TextView serverStatus = viewQFragmentItemBinding.serverStatus;
        TextView serverNumber = viewQFragmentItemBinding.serverNumber;
        TextView userOnCall = viewQFragmentItemBinding.userOnCall;
        TextView duration = viewQFragmentItemBinding.callDuration;
        ImageView userProfile = viewQFragmentItemBinding.profilePicture;


        serverNameTxt.setText(server.getServerName());
        serverStatus.setText(Utils.getServerStatus(server.getServerStatus(),context));
        serverNumber.setText(String.valueOf(server.getServerNumber()).substring(3));
        if (server.getCallRequest()!= null){
            userOnCall.setText(server.getCallRequest().getUser());
            duration.setText(Utils.getTimeOnMinutes(server.getCallRequest().getTime(),context,false));
            Uri profilePictureUri = Uri.parse(server.getCallRequest().getProfilePicture());
            userProfile.setScaleX(1);
            userProfile.setImageResource(ListOfProfilePictureSmallsInt.get(Utils.getPhotoUrlIndex(profilePictureUri)));
        } else {
            userOnCall.setText("");
            duration.setText("");
            userProfile.setScaleX(-1);
            userProfile.setImageResource(R.drawable.ic_waiting);
        }

    }
}


@NonNull
@Override
public ViewServersAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());
    viewServersFragmentItemBinding = ViewServersFragmentItemBinding.inflate(inflater,parent,false);
    // create a new view
    ConstraintLayout v = (ConstraintLayout) viewServersFragmentItemBinding.getRoot();
    RecyclerView.LayoutParams lp = new RecyclerView.LayoutParams(
            ViewGroup.LayoutParams.MATCH_PARENT, //width
            ViewGroup.LayoutParams.WRAP_CONTENT);//height
    v.setLayoutParams(lp);//override default layout params

    return new MyViewHolder(v, context);
}

@Override
public void onBindViewHolder(@NonNull ViewServersAdapter.MyViewHolder holder, int position) {
    Server server = serversArrayList.get(position);
    holder.bindView(server, viewServersFragmentItemBinding);
}

@Override
public int getItemCount() {
    return serversArrayList.size();
}
}
final ViewModelForServers viewModel = new ViewModelProvider(this).get(ViewModelForServers.class);
final LiveData<ArrayList<Server>> liveData = viewModel.getServersMediatorLiveData();

liveData.observe(this, new Observer<ArrayList<Server>>() {
    @Override
    public void onChanged(@Nullable ArrayList<Server> serverArrayList) {
        if (serverArrayList != null) {
            mainArrayListForServers.clear();
            mainArrayListForServers.addAll(serverArrayList);
            mAdapterForServers.notifyDataSetChanged();

        }
    }
});