我有一个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);
}
任何想法的人?!
答案 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)
你不能这样打电话。请尝试以下步骤:
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");
}
}
}
从活动B开始,请在返回时执行以下操作:
Intent resultIntent = new Intent(); 在此处输入代码 resultIntent.putBoolean(" getPostIsLikedByYou"," your_value_here"); setResult(Activity.RESULT_OK,resultIntent);
希望得到这个帮助。
答案 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。如果它第一次而不是第二次工作,看起来你在错误的地方挂东西。请改用onPause
和onResume
。
答案 4 :(得分:0)
最后,我找到了解决方案! 问题是我在onResume中有这一行:
mAdapter = new RecyclerViewAdapterQuestions(this, arrayList);
删除此行后问题得以解决! 在本节中似乎我的适配器正在重置新数据,而不是我以前的数组! 谢谢你回答我:)