adapter.notifyDataSetChange()不起作用

时间:2018-05-04 11:05:14

标签: android android-recyclerview android-adapter recycler-adapter

我有一个recyclerview,它包含几行。 每一行都有一个用于喜欢和不喜欢的imageview(心形),我需要的是每次点击都会改变imageview的图像。 当我开始这个活动并且我的列表设置时,它运行良好并且通过单击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);
}

任何想法的人?!

5 个答案:

答案 0 :(得分:1)

在适配器中创建接口,用于喜欢和不喜欢点击事件,如下面的代码..  注意:取类似或类似的布尔值并生成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);
        }
    });
}

然后将适配器设置为recylcerview调用以下代码..

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

答案 1 :(得分: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();
}

答案 2 :(得分:0)

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

  1. 假设您当前的活动为A.您将切换到名为B
  2. 的活动
  3. 使用startActivityForResult(B.class,0x0)代替startActivity
  4. 在活动A:
  5. 中实施此功能

    boolean getPostIsLikedByYou = false; //这是从活动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开始,请在返回时执行以下操作:

      Intent resultIntent = new Intent(); 在此处输入代码 resultIntent.putBoolean(" getPostIsLikedByYou"," your_value_here"); setResult(Activity.RESULT_OK,resultIntent);

    2. 希望得到这个帮助。

答案 3 :(得分: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())));
}

现在确保您正确地将适配器连接到recyclerview。如果它第一次而不是第二次工作,看起来你在错误的地方挂东西。请改用onPauseonResume

答案 4 :(得分:0)

最后,我找到了解决方案! 问题是我在onResume中有这一行:

mAdapter = new RecyclerViewAdapterQuestions(this, arrayList);

删除此行后问题得以解决! 在本节中似乎我的适配器正在重置新数据,而不是我以前的数组! 谢谢你回答我:)