Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:在一个ListView项目中更改ImageView会在其他ListView项目中更改相同的ImageView吗?_Android_Listview - Fatal编程技术网

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

Android:在一个ListView项目中更改ImageView会在其他ListView项目中更改相同的ImageView吗?,android,listview,Android,Listview,我的列表视图项由以下组件组成-文本视图,然后在它下面有一个图像视图-类似 因此,当我单击like时,我希望能够将like图像视图从灰色更改为蓝色 当我点击like时,like图像视图确实从灰色变为蓝色。但不仅针对相应的列表视图项目,而且针对列表中的每三个项目-因此,如果我的列表中有10个项目,我单击列表中第一个项目的like,那么第四、第七和第十个项目like图像视图将从灰色变为蓝色 在我的post\u list\u item.xml中,在文件的根元素中,我指定了以下android:gender

我的
列表视图
项由以下组件组成-
文本视图
,然后在它下面有一个
图像视图
-
类似

因此,当我单击
like
时,我希望能够将
like
图像视图从灰色更改为蓝色

当我点击
like
时,
like
图像视图确实从灰色变为蓝色。但不仅针对相应的
列表视图
项目,而且针对列表中的每三个项目-因此,如果我的列表中有10个项目,我单击列表中第一个项目的
like
,那么第四、第七和第十个项目
like
图像视图
将从灰色变为蓝色

在我的
post\u list\u item.xml中,在文件的
根元素中,我指定了以下
android:genderantfocusability=“blocksDescendants”
,但它也没有帮助

我的问题是-我必须做些什么,以便当我点击
like
时,我能够将
like
图像视图从灰色更改为蓝色,而不影响其他列表项

这是我的密码:

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;

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

  • setIvLike
    需要以这样或那样的方式修改Post对象,以便在将其滚动到屏幕外时,即使使用循环视图,也可以完全按照显示的方式重新创建视图。因此,重要的是要知道您更改了视图的哪些属性,并在重用/创建后一致地在getView中设置每个属性


  • 你需要在你的Post类中有一个属性来跟踪你喜欢的帖子

    更新的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();
    
        }
    
    };
    

    比你好多了。我花了一个多星期的时间在这张表格上苦苦挣扎,终于成功了。谢谢你花时间回答我的问题。
    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();
    
        }
    
    };