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