2011-09-14 52 views
13

我有一個列表視圖與圖像。當我選擇每個項目的圖像改變點擊image.But當我選擇另一個項目都圖像changes.I只想選擇的項目改變該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接口;這需要對佈局的根視圖進行一些自定義。假設它的LinearLayout作爲根,一個實現可能像:

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

您的佈局文件應該被更新以引用MyListItem類,而不是過多的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. 將您的選擇器設置爲背景。

    android:background="@drawable/your_selector" 
    

    供參考:

+1

這是一個優雅的解決方案。對我來說關鍵是意識到我需要在'ListLine'上使用'LinearLayout'項目上的'android:background =「@ drawable/your_selector」'而不是''drawable/your_selector =''。 –

相關問題