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

标签 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 文件的 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;
    }
}

最佳答案

  1. 当 View 被重用时,您并不是在 getView 中“重置” View 。您需要将回收 View 设置回正确的状态。这是在您创建或重用 ViewHolder 的 if-else block 之后完成的。

  2. setIvLike 将需要以一种或另一种方式修改该 Post 对象,以便当它从屏幕上滚动时,即使它使用回收的看法。因此,重要的是要知道您更改了 View 的哪些属性,并在重用/创建后在 getView 中始终设置每个这些属性。

关于Android:在一个 ListView 项中更改 ImageView 会更改其他 ListView 项中的相同 ImageView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39677525/

相关文章:

android - Multipart Retrofit 2.0 图片上传

android - Listview 不在 android 中显示正确的图像

java - 当我调用我的自定义 ListView 适配器时,我的应用程序失败

android - 更改 Nativescript Listview `onItemTap` 背景颜色?

android - Android 上的快速视频压缩

android - 使用 native android sip 库没有音频

android - 适用于 iOS 和 Android 的最佳 App Analytics 是什么?

android - 如何在android中创建时间轴组件

android - 在android中选择和切换项目

android - 如何仅显示通话记录android中的未接来电