2017-11-06 14 views
1

これはすでに多くの時間が尋ねられています。しかし、私はそれを成功裏に実装することはできません多くのソリューションを試した後。リストアイテム更新のListViewアダプタonClickListener

私はいくつかのViewを含むカスタムレイアウトのリストを作成しています。ビューの1つはImageViewです。ユーザーがクリックするたびにそのアイコンを変更したいと考えています。次のように私が使用し

ListAdapterクラスがある:

これを行う
public class PetitionListAdapter extends BaseAdapter { 

    ViewHolder holder = null; 

    private LayoutInflater inflater; 
    private ArrayList<CustomObject> objects; 

    private class ViewHolder { 
     ImageView ivsign; 
    } 

    public PetitionListAdapter(Context context, ArrayList<CustomObject> objects) { 
     inflater = LayoutInflater.from(context); 
     this.objects = objects; 
    } 

    public int getCount() { 
     return objects.size(); 
    } 

    public CustomObject getItem(int position) { 
     return objects.get(position); 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public View getView(final int position, View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      holder = new ViewHolder(); 
      convertView = inflater.inflate(R.layout.petition_list_layout_beta, null); 
      holder.ivsign = convertView.findViewById(R.id.ivsign); 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     holder.ivsign.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       ImageView img = v.findViewById(R.id.ivsign); 
       img.setImageResource(R.drawable.icon_after_click); 
      } 
     }); 
     return convertView; 
    } 
} 

、clickListenerは動作しますが、代わりにその特定のImageViewので、それがランダム行で多くのimageviewsのアイコンを変更します。私はviewHolderのためにそのことを知っています。しかし、これをどうすれば正しく行うことができますか?

また、私は使用していた: -

imgViewArray [位置] = holder.textView1。 "onListItemClickListener"内には、

があります。これを実行すると、その位置のアイコンが必要に応じて変更されますが、スクロールして再びその行に戻った後、再びデフォルトのアイコンに変更されます。私はこれが行がリサイクルされるためだと知っています。

+0

あなたのコードで述べたように変更に関するアダプタnotify' 'その後、位置を更新するために、データセットから位置を使用してください:あなたは、あなたのCustomObjectでのようなものを項目の位置を保存する必要があります。 – codeFreak

答えて

1

もちろん、この問題があります。どうして?リストビューをスクロールすると、すべてのconvert viewが再利用され、それぞれconvertViewが別のCustomObjectを表示するために使用されたためです。つまり、最初の行のイメージを変更した場合、スクロール後にfirst-row convertViewを再利用した行は、imageとしてclicked rowと表示されます。だから、それを解決する方法は?

public View getView(final int position, View convertView, ViewGroup parent) { 
    if (convertView == null) { 
     holder = new ViewHolder(); 
     convertView = inflater.inflate(R.layout.petition_list_layout_beta, null); 
     holder.ivsign = convertView.findViewById(R.id.ivsign); 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 
    final CustomObject object = listCustomObject.get(position); 
    holder.ivsign.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      ((ImageView)v).setImageResource(R.drawable.icon_after_click); 
      object.saveResourceId(R.drawable.icon_after_click); // save your resource to use after scrolling. 
     } 
    }); 
    // display resouce base on what's saved or display default image. 
    holder.ivSign.setImageResource(object.getSavedResourceId()); 
    return convertView; 
} 
+0

それは働いた!私はそれを正しく行った場合CustomObjectクラスをチェックしてください? 'public class CustomObject { プライベートint resId = R.drawable.ic_sign; public CustomObject(){} public String getProp9(){ return prop9; } public void saveResourceId(int rid){this.resId = rid; } public int getSavedResourceId(){戻りresId; } } ' – Rishabh

0

あなたの問題はonClickListenerから発生していると思います。 ViewHolderImageViewの値を設定してからonClickメソッド内でv.findViewByIdを実行します。あなたは何をすべき

ImageView img = (ImageView) convertView.findViewById(R.id.ivsign); 

そして

img.setOnClickListener(.......); 

これは私のために働くので、あなたが実装するすべての問題を抱えているなら、私に知らせています。

+0

まだ問題は同じです。すなわち、ランダムな画像ビューアイコンを変更します。 – Rishabh

0

これは良いことではありません。 OnItemClickでは、リストで使用されているオブジェクトのリストを変更してから、notifyDataSetChanged()を呼び出す必要があります。 getView(...)では、単にlistViewにリストからの値を反映させるべきです。 この方法では、リストを最新表示すると、ビューの状態は変わりません。

+0

リストを更新していないと、最初の行からデータが再び表示されますか?実際には、ユーザーがimageViewをクリックしてスクロールを続けると、アイコンの変更が必要になります(facebookで「好き」ボタンをクリックするのと同じです)。そして、もし答えが「いいえ」ならば、私はそれを絶対に使うつもりです。 – Rishabh

関連する問題