Android:在一个ListView项目中更改ImageView会更改其他ListView项目中的相同ImageView吗?

时间:2016-09-24 14:36:23

标签: android listview

我的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;

    }
}

2 个答案:

答案 0 :(得分:2)

  1. 重复使用视图时,您不会“重置”getView中的视图。您需要将回收的视图设置回正确的状态。这是在创建或重用ViewHolder的if-else块之后完成的。

  2. 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();

    }

};