【问题标题】:notifyDataSetChange() Is not working in adapternotifyDataSetChanged() 在适配器中不起作用
【发布时间】:2021-06-25 06:44:23
【问题描述】:

我正在使用 Android 的新 RecyclerView,但每当我调用“通知”方法之一时,我都无法让我的自定义适配器刷新。

我尝试调用 notifyDataSetChanged、notifyItemRangeInserted 和 notifyItemInserted,但它们似乎都不起作用。

我得到的列表大小是正确的,但 recycleview 只设置 10 个项目 当我滚动页面时调用 api。更新后的列表大小为 20 但不显示其他 10 个项目。我想显示所有项目在列表中请帮助我....

这是我的适配器

public class NotificationAdapter extends RecyclerView.Adapter<NotificationAdapter.ViewHolder> {

Context context;
List<NotificationDataItem> mData;


public NotificationAdapter(Context context, List<NotificationDataItem> mData) {
    this.context=context;
    this.mData=mData;
}


@NotNull
@Override
public NotificationAdapter.ViewHolder onCreateViewHolder(@NotNull ViewGroup parent, int viewType) {
    AdapterNotificationBinding adapterNotificationBinding = DataBindingUtil.inflate(
            LayoutInflater.from(parent.getContext()), R.layout.adapter_notification,
            parent, false);
    return new NotificationAdapter.ViewHolder(adapterNotificationBinding);

}

@Override
public void onBindViewHolder(@NotNull NotificationAdapter.ViewHolder holder, int position) {

    if (mData.get(position).getName()!=null&&!mData.get(position).getName().isEmpty()){
        holder.binding.tvUserNotification.setText(mData.get(position).getName());
    }
    if (mData.get(position).getBody()!=null&&!mData.get(position).getBody().isEmpty()){
        holder.binding.tvUserNotificationBody.setText(mData.get(position).getBody());
    }
    if (mData.get(position).getCreatedAt()!=null&&!mData.get(position).getCreatedAt().isEmpty()){
        holder.binding.tvTime.setText(mData.get(position).getCreatedAt());
    }
    if (mData.get(position).getAvatar()!=null){
        Glide.with(context)
                .load(mData.get(position).getAvatar())
                .circleCrop()
                .placeholder(R.drawable.ic_white_speaker)
                .error(R.drawable.ic_white_speaker)
                .into(holder.binding.ivUser);
    }
    /*type => 0 = comment, 1 = like, 2 = unlike, 3 = comment reply

   */
    if (mData.get(position).getType()!=null){
        switch (mData.get(position).getType()) {
            case "0":case "3":
                holder.binding.ivEditProfileImage.setColorFilter(ContextCompat.getColor(context, R.color.colorgray), android.graphics.PorterDuff.Mode.SRC_IN);
                holder.binding.ivEditProfileImage.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_comment_filled));
                break;
            case "1":
                holder.binding.ivEditProfileImage.setColorFilter(ContextCompat.getColor(context, R.color.colorgray), android.graphics.PorterDuff.Mode.SRC_IN);
                holder.binding.ivEditProfileImage.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_like_filled));

                break;
            case "2":
                holder.binding.ivEditProfileImage.setRotation(180);
                holder.binding.ivEditProfileImage.setColorFilter(ContextCompat.getColor(context, R.color.colorgray), android.graphics.PorterDuff.Mode.SRC_IN);
                holder.binding.ivEditProfileImage.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_like_filled));
                break;
            /*case "3":
                holder.binding.ivEditProfileImage.setColorFilter(ContextCompat.getColor(context, R.color.colorgray), android.graphics.PorterDuff.Mode.SRC_IN);
                holder.binding.ivEditProfileImage.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_comment_filled));
                break;*/
        }

    }


    holder.binding.llNotification.setOnClickListener(v->{
        Intent intent = new Intent(context, PostDetailsActivity.class);
        intent.putExtra("postId", mData.get(position).getPostId());
        context.startActivity(intent);
    });

    holder.binding.ivUser.setOnClickListener(v->{
        Intent intent = new Intent(context, OtherUserProfileActivity.class);
        intent.putExtra("userId", mData.get(position).getUserId());
        context.startActivity(intent);
    });
}


@Override
public int getItemCount() {
    return mData.size();
}
public void updateList(List<NotificationDataItem> mNotification) {
    this.mData.addAll(mNotification);
    Log.d("updateList", "updateList:"+mData.size());
    notifyDataSetChanged();
    Log.d("updateList123", "updateList123:"+mData.size());
}


public static class ViewHolder extends RecyclerView.ViewHolder {
    AdapterNotificationBinding binding;

    public ViewHolder(AdapterNotificationBinding binding) {
        super(binding.getRoot());
        this.binding = binding;
    }
}

}

这就是我的附加方式:

  adapter = new NotificationAdapter(  getActivity(),response.body().getData().getData() );
                                    
                                        if (page == 1) {
                                            binding.rvNotification.setAdapter(adapter);
                                        } else {
                                            adapter.updateList(response.body().getData().getData());
        
                                        }

【问题讨论】:

  • 您的适配器看起来不错,您能否说明如何创建它并附加到RecyclerView 以及如何/何时更新其数据?我假设放入 update 方法的日志显示的数量大于 RecyclerView 包含的项目?
  • @snachmsm 是的...我编辑了我的问题
  • this.notifyDataSetChanged();adapter.notifyDataSetChanged();

标签: android list android-recyclerview android-adapter


【解决方案1】:

当第 2 页被调用时我得到了解决方案

  if (page == 1) {
 adapter =new NotificationAdapter(getActivity(),response.body().getData().getData());
                                    binding.rvNotification.setAdapter(adapter);
                                } else {
                                    adapter.updateList(response.body().getData().getData());

                                }

【讨论】:

  • 因为你比我更早找到解决方案而投票(发布答案更快):) 祝你好运!
【解决方案2】:

您每次都在创建新的adapter 实例,而不是更新已创建并附加到RecyclerView 的实例。将您的创建代码移动到 if 中,以便只创建和附加适配器一次,然后在 else 中您可以更新它(相同的引用,相同的对象)

if (page == 1) {
    adapter = new NotificationAdapter(getActivity(), response.body().getData().getData());
    binding.rvNotification.setAdapter(adapter);
} else {
    adapter.updateList(response.body().getData().getData());
}

另一种方法是每次都创建新适配器,但您还必须调用setAdapter(adapter);(新适配器)。更新已经存在的方法是更好的方法

【讨论】:

    猜你喜欢
    • 2011-04-26
    • 2015-02-27
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多