簡體   English   中英

Android:在一個ListView項目中更改ImageView會更改其他ListView項目中的相同ImageView嗎?

[英]Android: changing ImageView in one ListView item changes the same ImageView in other ListView items?

我的ListView項目包含以下組件 - TextView ,然后在它下面有一個ImageView - like

所以,當我點擊like我希望能夠在改變like ImageView由灰色變為藍色。

目前,當我點擊likelike ImageView確實改變了從灰色到藍色。 但不僅對於相應的ListView項目而且對於列表中的每個第3項目 - 所以如果我的列表中有10個項目並且我點擊列表中第一個項目的like ,那么like ImageView第4個,第7個和第10個項目將從灰色到藍色。

在我的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. 重新使用視圖時,您不會在getView “重置”視圖。 您需要將回收的視圖設置回正確的狀態。 這是在創建或重用ViewHolder的if-else塊之后完成的。

  2. setIvLike將需要以某種方式修改Post對象,這樣當它在屏幕上滾動時,即使使用循環視圖,也可以完全按照其顯示的方式重新創建視圖。 因此,在重用/創建之后,了解更改視圖的哪些屬性並在getView中始終設置每個屬性非常重要。

您需要在Post Class中擁有一個屬性來跟蹤該帖子已被喜歡

更新了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;
}

}

並在Adapter的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();

    }

};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM