adapter.notifyDataSetChange() 不起作用

问题描述 投票:0回答:5

我有一个回收视图,它包含几行。 每行都有一个图像视图(心形)用于喜欢和不喜欢,我需要的是每次通过单击更改图像视图的图像。 当我启动此活动并设置列表时,它运行良好,并且通过单击 imageview 更改图像,但问题是当我启动另一个活动并返回此活动时,onclick 不起作用。 看来我的适配器没有通知数据! 这是我点击 imageview 后的代码:

public static void afterLikeChanged(Post post) {
    if (!post.getPostIsLikedByYou()) {
        post.setPostIsLikedByYou(true);
    } else {
        post.setPostIsLikedByYou(false);
    }
    mAdapter.notifyDataSetChanged();
}

在适配器类的另一边:

boolean isliked = post.getPostIsLikedByYou();
if (!isliked) {
    holder.imglike.setImageResource(R.drawable.btn_like);
} else {
    holder.imglike.setImageResource(R.drawable.btn_liked);
}

大家有什么想法吗?!

android android-adapter android-recyclerview
5个回答
1
投票

在适配器中为喜欢和不喜欢点击事件创建界面,如下面的代码.. 注意:为 like 或 like 取布尔值并制作 getter setter。

    onItemClickListner onItemClickListner;

public interface onItemClickListner {
    void onClick(User str);//pass your object types.
}
public void setOnItemClickListner(RecyclerViewAdpater.onItemClickListner onItemClickListner) {
    this.onItemClickListner = onItemClickListner;
}
    @Override
public void onBindViewHolder(ItemViewHolder holder, int position) {
    // below code handle click event on recycler view item.
    User data=userlist.get(position);
    if (!data.isliked()) {
        holder.imglike.setImageResource(R.drawable.btn_like);
    } else {
        holder.imglike.setImageResource(R.drawable.btn_liked);
    }
    holder.imageHeart.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            onItemClickListner.onClick(data);
        }
    });
}

然后将适配器设置为 recyclerview 后调用下面的代码..

   recyclerViewAdpater.setOnItemClickListner(new RecyclerViewAdpater.onItemClickListner() {
       @Override
       public void onClick(User str) {
           if (str.isLike()){
               str.setLike(false);
           }
           else{
               str.setLike(true);
           }
           recyclerViewAdpater.notifyDataSetChanged();
       }
   });

0
投票

您需要在通知适配器之前更新您的帖子列表

类似这样的:

public static void afterLikeChanged(int position, Post post) {
    if (!post.getPostIsLikedByYou()) {
        post.setPostIsLikedByYou(true);
    } else {
        post.setPostIsLikedByYou(false);
    }
    // postList is a ArrayList that you passed to your adapter
    postList.set(position, post);
    mAdapter.notifyDataSetChanged();
}

0
投票

你的代码似乎有点分离。像这样的东西将封装行为。您想要的只是更改图标并保留帖子的状态。

跟踪您保存的内容非常重要。

您的适配器类。它缺少很多代码,但类似这样。

List<Post> posts; // init this in constructor

public void update(List<Post> posts) {
    // do some nullchecking, maybe clone the posts. It's sent as a reference now. 
    this.posts = posts; 
    notifyDataSetChanged();
}

@Override
public void onBindViewHolder(final MyViewHolder viewHolder, int position) {
    final Post post = posts.get(position);
    if (post != null) {
        if (post.isLiked()) {
            holder.imglike.setImageResource(R.drawable.btn_liked);  
        } else {
            holder.imglike.setImageResource(R.drawable.btn_like); // change name of this
        }
    }
}

public void afterLikeChanged(Post post) {
    post.setIsLiked(!post.isLiked());
    notifyDataChanged();
}

class MyViewHolder extends RecyclerView.ViewHolder {
    // super, etc...

    // this is a lazy way to use it, not safe. 
    // You should create a listener that sends back the getAdapterPosition()
    itemView.setOnClickListener(v -> afterLikeChanged(posts.get(getAdapterPosition())));
}

现在请确保您已将适配器正确连接到回收器视图。如果第一次有效而第二次无效,则似乎您将东西连接到了错误的位置。请改用

onPause
onResume


0
投票

终于找到解决办法了! 问题是我在 onResume 中有这一行:

mAdapter = new RecyclerViewAdapterQuestions(this, arrayList);

َ删除这条线后问题就解决了! 看来在本节中我的适配器正在使用新数据重置,而不是使用之前的数组! 谢谢你回复我:)


0
投票

你不能就这样打电话。请尝试以下步骤:

  1. 假设您当前的 Activity 是 A。您将切换到名为 B 的 Activity
  2. 使用 startActivityForResult(B.class, 0x0) 代替 startActivity
  3. 在活动 A 中实现这一点:

boolean getPostIsLikedByYou = false;// 这是您从 Activity B 获取新值的变量

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Check which request we're responding to
    if (requestCode == 0x0) {
        // Make sure the request was successful
        if (resultCode == RESULT_OK) {
            getPostIsLikedByYou = data.getBoolean("getPostIsLikedByYou");      
        }
    }
}
  1. 从活动 B 返回时执行此操作:

    意图 resultIntent = new Intent();

    resultIntent.putBoolean("getPostIsLikedByYou", "your_value_here"); setResult(Activity.RESULT_OK, resultIntent);

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.