2016-09-24 3 views
1

私のListViewアイテムは、以下のコンポーネントで構成されています。TextViewそして、その下には、ImageView-likeの1つがあります。Android:1つのListViewアイテムのImageViewを変更すると、他のListViewアイテムの同じImageViewが変更されますか?

likeをクリックすると、likeImageViewを灰色から青色に変更したいと考えています。

likeをクリックすると、likeImageViewはグレーからブルーに変わります。しかし、対応するListViewアイテムだけでなく、リスト内のすべての3番目のアイテムについて - リストにある最初のアイテムのlikeをクリックすると、4番目、7番目、10番目のアイテムlikeImageViewからの変更灰色から青まで。

ファイルroot elementの私のpost_list_item.xmlには、次のように指定しました。android:descendantFocusability="blocksDescendants"ですが、どちらでも役に立ちません。

私の質問は - 私は何をすべきかを持っていないので、私はlikeをクリックしたとき、私は他のリスト項目に影響を与えずに青に灰色からlikeImageViewを変更することができるだろうということ?

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

あなたはそのポストが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メソッドにされた追跡するために、あなたのポストクラス内のプロパティを持っている必要がありますTAのためのあなたより

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

    } 

}; 
+0

あなたより。私は今週よりこのフォーム鉱石で苦労して、ついにそれが働いています。 – Nikolaj

2
  1. ビューが再利用されたときは、getViewでビューを "リセット" していない:

    は、ここに私のコードです。リサイクルされたビューを正しい状態に戻す必要があります。これは、ViewHolderを作成または再利用するif-elseブロックの後に実行されます。

  2. setIvLikeこのようにPostオブジェクトを変更する必要があるため、画面からスクロールすると、リサイクルされたビューを使用している場合でも表示が正確に再現されます。そのため、あなたが変更と一貫して再利用/作成後のgetViewメソッドでこれらのプロパティのすべてのを設定したビューのプロパティを知ることが重要です。

+0

非常に多く私の質問に答えてあなたの時間をキングしてください。 – Nikolaj

関連する問題