2011-09-14 15 views
13

私は画像でリストビューを持っています。各アイテムを選択すると画像がクリックされた画像に変わります。しかし、別のアイテムを選択すると、 image.itは、単一の選択肢mode.plsのラジオボタンのように機能しなければなりません。画像をリストビューに選択する方法をシングルに設定する方法

public class ProvierActivity extends Activity { 
    private String text[] = { "BroadStripe-Cable (Seattle)", "BroadStripe-Digital (Seattle)", 
     "BroadStripe-Cable (Seattle)", "Comcast king county south)", "BroadStripe-Cable (Seattle)", 
     "Comcast king county south", "BroadStripe-Digital (Seattle)", "BroadStripe-Digital (Seattle)", 
     "BroadStripe-Cable (Seattle)", "Comcast king county south" }; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     final ListView list = (ListView) findViewById(R.id.listview_id); 

     list.setAdapter(new ArrayAdapter<String>(this, R.layout.list, 
      R.id.title, text)); 

     list.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
      public void onItemClick(AdapterView<?> arg0, View view, 
       int position, long arg3) { 
       // TODO Auto-generated method stub 

       if (view.findViewById(R.id.img).getVisibility() == ImageView.VISIBLE) { 
        ImageView icon = (ImageView) view.findViewById(R.id.img); 

        icon.setImageResource(R.drawable.checked); 
       } 
      } 
     }); 
    } 
} 
+0

将来の参考** ** https://www.youtube.com/watch?v = s4JwU28VMko ** –

答えて

37

ここで推奨される解決策は、それを単一選択モードを指定して、内蔵のListViewの選択サポートに依存することです:

list.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 

その後、Checkableインターフェイスを実装するために実装するためにあなたのリスト項目をさせてください。レイアウトのルートビューをカスタマイズする必要があります。

public class MyListItem extends LinearLayout implements Checkable { 

    public MyListItem(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public MyListItem(Context context) { 
     super(context); 
    } 

    private boolean checked = false; 

    private ImageView icon; 

    @Override 
    protected void onFinishInflate() { 
     super.onFinishInflate(); 
     icon = (ImageView)findViewById(R.id.img); // optimisation - you don't need to search for image view every time you want to reference it 
    } 
    @Override 
    public boolean isChecked() { 
     return checked; 
    } 

    @Override 
    public void setChecked(boolean checked) { 
     this.checked = checked; 
     if (icon.getVisibility() == View.VISIBLE) { 
      icon.setImageResource((checked) ? R.drawable.checked : R.drawable.unchecked); 
     } 
    } 

    @Override 
    public void toggle() { 
     setChecked(!checked); 
    } 
} 

あなたのレイアウトファイルはもちろん、あまりにも代わりのLinearLayoutのMyListItemクラスを参照するように更新する必要がありますように、それはrootとしてのLinearLayoutを持っていると仮定すると、実装が見えることがあります。

これはやや難しいアプローチかもしれませんが、アクティビティの再作成時に自動的にチェックされたアイテムを復元するなどの利点があります。

別のオプションは、再びリストの選択モードを使用して項目がチェックされているかどうかを知るために、アダプタのgetViewメソッドをオーバーライドし、それに応じて画像を更新することです:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    final ListView list = getListView(); 
    list.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
    list.setAdapter(new ArrayAdapter<String>(this, R.layout.list_item, 
      R.id.title, text) { 
     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      View v = super.getView(position, convertView, parent); 
      ImageView icon = (ImageView) v.findViewById(R.id.img); 
      if (list.isItemChecked(position)) { 
       icon.setImageResource(R.drawable.checked); 
      } else { 
       icon.setImageResource(R.drawable.unchecked); 
      } 
      return v; 
     } 
    }); 
} 

ただし、このバージョンでは、いくつかのパフォーマンスの問題を持っている - findViewByIdとsetImageResourceは比較的です時間のかかる操作になるため、キャッシュの使用を検討する必要があります。私は"The world of ListView" videoを見て、このウィジェットに関する非常に役に立つヒントを学ぶことをお勧めします。

また、後者のアプローチでは、アダプタをリストビューに結びつけるため、不要な結合が発生します。

+2

のためにこれをチェックしてくださいこれは非常に一般的な問題であると思われるので、 –

+0

+1魅力的な作品です。それを共有してくれてありがとう。 – Dharmendra

+0

良い答え。非常にエレガントなソリューション。ありがとう! – dum4ll3

4
  1. リストビューで正しい選択モードを設定します。 setChoiceModeが必要です。
  2. 状態に応じて、必要なイメージを使用する描画可能セレクタを作成します。
  3. セレクタを背景として設定します。 FYI

    android:background="@drawable/your_selector" 
    

+1

これはそのような洗練されたソリューションです。私にとって重要なのは、 'ListView'で' android:list_selector = "@ drawable/your_selector"を使用する代わりに、 'LinearLayout'アイテムに' android:background = "@ drawable/your_selector" 'を使用する必要があるということでした。 –

関連する問題