我的ListView
项目包含以下组件 - TextView
,然后在其下面有一个ImageView
- like
。
因此,当我点击like
时,我希望能够将like
ImageView
从灰色更改为蓝色。
当我点击like
时,like
ImageView
确实从灰色变为蓝色。但不仅对于相应的ListView
项而且对于列表中的每个第3项 - 所以如果我的列表中有10个项目,则单击列表中第一项的like
,然后是第4项,第7项和第10项like
ImageView
从灰色变为蓝色。
在文件post_list_item.xml
的{{1}}中,我指定了以下root element
,但它也没有帮助。
我的问题是 - 我必须这样做,当我点击android:descendantFocusability="blocksDescendants"
时,我可以将like
like
从灰色更改为蓝色,而不会影响其他列表项?
这是我的代码:
ImageView
Post.java
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;
}
}
答案 0 :(得分:2)
重复使用视图时,您不会“重置”getView
中的视图。您需要将回收的视图设置回正确的状态。这是在创建或重用ViewHolder的if-else块之后完成的。
setIvLike
将需要以某种方式修改Post对象,以便当它在屏幕上滚动时,即使使用循环视图,也可以完全按照其显示的方式重新创建视图。出于这个原因,重要的是要知道您更改视图的哪些属性,并在重用/创建后在getView中始终设置每个其中一个属性。
答案 1 :(得分:1)
您需要在帖子类中拥有一个属性才能跟踪该帖子已被广告
更新了Post.Java
public class Post {
String post;
String liked;
public bool isLiked; // Add this
public void setIvLike(View view){
if(!isLiked)
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;
}
}
在适配器的getView方法中
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);
holder.setIvLike(ivLike); // Add this
return convertView;
}
private View.OnClickListener mClickListener = new View.OnClickListener() {
public void onClick(View v) {
int pos = (Integer) v.getTag();
list.get(pos).isLiked = true;
// post.setIvLike(v); // No need to update here
CustomListAdapter.this.notifyDataSetChanged();
}
};