我有一个回收视图,它包含几行。 每行都有一个图像视图(心形)用于喜欢和不喜欢,我需要的是每次通过单击更改图像视图的图像。 当我启动此活动并设置列表时,它运行良好,并且通过单击 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);
}
大家有什么想法吗?!
在适配器中为喜欢和不喜欢点击事件创建界面,如下面的代码.. 注意:为 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();
}
});
您需要在通知适配器之前更新您的帖子列表
类似这样的:
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();
}
你的代码似乎有点分离。像这样的东西将封装行为。您想要的只是更改图标并保留帖子的状态。
跟踪您保存的内容非常重要。
您的适配器类。它缺少很多代码,但类似这样。
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
。
终于找到解决办法了! 问题是我在 onResume 中有这一行:
mAdapter = new RecyclerViewAdapterQuestions(this, arrayList);
َ删除这条线后问题就解决了! 看来在本节中我的适配器正在使用新数据重置,而不是使用之前的数组! 谢谢你回复我:)
你不能就这样打电话。请尝试以下步骤:
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");
}
}
}
从活动 B 返回时执行此操作:
意图 resultIntent = new Intent();
resultIntent.putBoolean("getPostIsLikedByYou", "your_value_here"); setResult(Activity.RESULT_OK, resultIntent);
希望这有帮助。