2011-10-18 80 views
0

嗨,我想實現一個長列表,其中用戶可以檢查列表中的項目view.when滾動列表項,然後我將檢查的項目存儲在sparseboolean數組,但是當我嘗試通過點擊一個按鈕來檢查哪些項目被選中。它顯示奇怪的行爲。當我檢查第一個項目,然後單擊按鈕然後它給了正確的結果,但是當我開始檢查從列表底部的項目。那麼它顯示出奇怪的行爲。從0-13索引有14個項目。當我檢查第13個元素時,它沒有顯示吐司。當我點擊第12個元素時,它顯示沒有吐司。當我點擊第12個元素時,它顯示沒有吐司第一次吐司出現時我點擊第8元素。請幫助我找出我錯在哪裏,並幫助我修復bug。當我點擊第7元素三敬酒來到7,8,9當我點擊第6元素5toast出現6,7, 8,9,10。請幫助我解決這個bug。我想顯示選中的烤麪包中的數字。 這裏是我的代碼檢查列表視圖中檢查的項目

/** 
* This example shows how to create a list of checkboxes. 
*/ 
public class CheckboxActivity extends ListActivity implements 
AdapterView.OnItemClickListener { 
    static SparseBooleanArray mCheckStates; 
    private CheckBoxAdapter mCheckBoxAdapter; 
    List<Boolean> check; 
    Button btn; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     mCheckBoxAdapter = new CheckBoxAdapter(this, 
R.layout.list_item_checkbox, GENRES); 
     setListAdapter(mCheckBoxAdapter); 
     check=new ArrayList<Boolean>(); 
     final ListView listView = getListView(); 
     listView.setItemsCanFocus(false); 
     listView.setTextFilterEnabled(true); 
     listView.setOnItemClickListener(this); 
     btn=(Button)findViewById(R.id.btn); 
     btn.setOnClickListener(new OnClickListener(){ 

      @Override 
      public void onClick(View arg0) { 
       // TODO Auto-generated method stub 
       for(int i=0;i<mCheckStates.size()+1;i++) 
        if(mCheckStates.get(i)==true) 
         Toast.makeText(CheckboxActivity.this,i+" " ,Toast.LENGTH_SHORT).show(); 
      } 

     }); 
    } 
    public void onItemClick(AdapterView parent, View view, int 
position, long id) { 
     mCheckBoxAdapter.toggle(position); 
    } 
    private static class CheckBoxAdapter extends ArrayAdapter<String> 
      implements CompoundButton.OnCheckedChangeListener { 

     public CheckBoxAdapter(Context context, int resource, String[] 
objects) { 
      super(context, resource, objects); 
      mCheckStates = new SparseBooleanArray(objects.length); 
     } 
     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      final CheckBox view = (CheckBox) super.getView(position, 
convertView, parent); 
      view.setTag(position); 
      view.setChecked(mCheckStates.get(position, false)); 
      view.setOnCheckedChangeListener(this); 
      return view; 
     } 
     public boolean isChecked(int position) { 
      return mCheckStates.get(position, false); 
     } 
     public void setChecked(int position, boolean isChecked) { 
      mCheckStates.put(position, isChecked); 
      notifyDataSetChanged(); 
     } 
     public void toggle(int position) { 
      setChecked(position, !isChecked(position)); 
     } 
     public void onCheckedChanged(CompoundButton buttonView, 
boolean isChecked) { 
      mCheckStates.put((Integer) buttonView.getTag(), isChecked); 
     } 
    } 
    private static final String[] GENRES = new String[] { 
     "Action", "Adventure", "Animation", "Children", "Comedy", 
"Documentary", "Drama", 
     "Foreign", "History", "Independent", "Romance", "Sci-Fi", 
"Television", "Thriller" 
    }; 
} 
+0

HUH ?!請考慮把你的段落分成幾塊。很難理解5行句子描述你的檢查項目的流程。 – Jack

+0

@Jack你好,我想現在我解釋正確的問題,請幫助。 –

+0

你有沒有想過這個?我只是注意到,在你的for循環btn onClickListener,你是從i = 1,到mCheckStates.size()+ 1,我認爲這應該只是mCheckStates.size() – Jack

回答

2

這是什麼方法做什麼?

public void onCheckedChanged(CompoundButton buttonView, 
          boolean isChecked) { 
    mCheckStates.put((Integer) buttonView.getTag(), isChecked); 
} 

您的列表行中是否有按鈕?

編輯:其實 - 看到this問題,因爲我認爲它會有所幫助。

+0

view.setOnCheckedChangeListener(this)實現CheckBox.no列表中的OnCheckedChangListener的功能,單擊時沒有按鈕按鈕是外部列表視圖,顯示被檢查的項目。 –

0

試圖回答相似的問題Here

其次,這種奇怪的行爲是因爲ListView重用視圖sp,您必須維護複選框的狀態並在您的Adapter的getView中使用該狀態。

相關問題