我的 ListView
项目由以下组件组成 - TextView
然后在它下面有一个 ImageView
- like
。
因此,当我点击like
时,我希望能够将like
ImageView
从灰色更改为蓝色。
当我点击 like
时,like
ImageView
确实从灰色变为蓝色。但不仅针对相应的 ListView
项目,而且针对列表中的每第 3 个项目 - 所以如果我的列表中有 10 个项目,我点击第一个项目的 like
在列表中,第 4、7 和 10 个项目 like
ImageView
从灰色变为蓝色。
在我的 post_list_item.xml
文件的 root element
中,我指定了以下 android:descendantFocusability="blocksDescendants"
但它没有'帮助。
我的问题是 - 我必须做什么才能在单击 like
时更改 like
ImageView
从灰色到蓝色而不影响其他列表项?
这是我的代码:
public class CustomListAdapter extends BaseAdapter {
LayoutInflater inflater;
ArrayList<Post> list;
public CustomListAdapter(PostActivity postActivity, ArrayList<Post> list) {
inflater = LayoutInflater.from(postActivity);
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.post_list_item, parent, false);
holder = new ViewHolder();
holder.tvPost = (TextView) convertView.findViewById(R.id.tvPost);
holder.ivLike = (ImageView) convertView.findViewById(R.id.ivLike);
holder.tvLikes = (TextView) convertView.findViewById(R.id.tvLikeCount);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
Post post = list.get(position);
holder.tvPost.setText(post.getPost());
holder.tvLikes.setText(post.getLiked());
holder.ivLike.setOnClickListener(mClickListener);
holder.ivLike.setTag(position);
return convertView;
}
private View.OnClickListener mClickListener = new View.OnClickListener() {
public void onClick(View v) {
int pos = (Integer) v.getTag();
Post post = (Post) list.get(pos);
post.setIvLike(v);
CustomListAdapter.this.notifyDataSetChanged();
}
};
static class ViewHolder
{
TextView tvPost ;
TextView tvLikes;
ImageView ivLike;
}
}
Post.java
public class Post {
String post;
String liked;
public void setIvLike(View view){
if(view.isActivated())
view.setActivated(false);
else
view.setActivated(true);
}
public String getPost() {
return post;
}
public void setPost(String post) {
this.post= post;
}
public String getLiked() {
return liked;
}
public void setLiked(String liked) {
this.liked = liked;
}
}
最佳答案
当 View 被重用时,您并不是在
getView
中“重置” View 。您需要将回收 View 设置回正确的状态。这是在您创建或重用 ViewHolder 的 if-else block 之后完成的。setIvLike
将需要以一种或另一种方式修改该 Post 对象,以便当它从屏幕上滚动时,即使它使用回收的看法。因此,重要的是要知道您更改了 View 的哪些属性,并在重用/创建后在 getView 中始终设置每个这些属性。
关于Android:在一个 ListView 项中更改 ImageView 会更改其他 ListView 项中的相同 ImageView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39677525/