2015-09-17 112 views
0

元素被添加到arraylist檢查複選框,但不取消選中它。 取消選中複選框,我必須從arraylist中刪除元素。 我寫了下面的代碼,讓我知道我錯了。我必須刪除從arraylist元素取消選中複選框

public class CustomAdapter extends BaseAdapter{ 
NameModel model; 
public static ArrayList<NameModel> nameArray; 

public View getView(int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 
    LayoutInflater mInflater = (LayoutInflater)context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
    convertView = mInflater.inflate(R.layout.item_list, null); 

    name = (TextView)convertView.findViewById(R.id.name); 
    cb = (CheckBox)convertView.findViewById(R.id.checkBox1); 
    cb.setTag(position); 
    nameArray = new ArrayList<NameModel>(); 

    cb.setOnClickListener(new View.OnClickListener() {    
     @Override 
     public void onClick(View view) { 
      int position = (Integer)view.getTag();     
      CheckBox checkbox = (CheckBox)view;     

      model = new NameModel(NameList.get(position).getName()); 
      model.setCheckedStatus(checkbox.isChecked()); 
      model.setName(NameList.get(position).getName()); 
      if(checkbox.isChecked()){ 
       CustomAdapter.nameArray.add(model); 
       Toast.makeText(context, "item checked ", Toast.LENGTH_SHORT).show(); 
      }else{ 
       CustomAdapter.nameArray.remove(model); 
       Toast.makeText(context, "item unchecked ", Toast.LENGTH_SHORT).show(); 
      } 
     } 
    }); 
} 
return convertView; 

}

我宣佈ArrayList中爲靜態,因爲它不是在getView方法訪問。

執行時,按預期方式打印兩個吐司,但不取消選中複選框時刪除該元素。

對上述問題的任何幫助將不勝感激。 在此先感謝。

+0

如何從列表中刪除不存在的項目? –

+0

我有一個複選框的自定義列表。第一個用戶將通過選中該複選框從列表中選擇任何元素,並將該元素添加到ArrayList中。但是通過取消選中複選框來取消選擇該元素時,該元素應該從ArrayList中移除。 – user3098795

+0

NameModel有一個equals和hash代碼實現? – StackFlowed

回答

2
public void onClick(View view) { 
    model = new NameModel(NameList.get(position).getName()); 
    (...) 
    CustomAdapter.nameArray.add(model); 
    (...) 
    CustomAdapter.nameArray.remove(model); 
} 

請注意,您永遠是您onClick事件的內部創建一個新對象Model。除非您的NameModel課程正確實施equals()hashcode(),否則該對象將不會從列表中刪除 - 僅僅因爲它不在那裏!你所擁有的是一個包含一個具有相同名稱但存儲地址不同的對象的列表。

你有兩種選擇:

  • 落實NameModelequals()hashcode(),所以Collection知道你的新創建的對象是「相同」作爲一個已經存在;

  • 遍歷搜索具有相同名稱的元素的列表並刪除這些元素。

+0

是的Marcelo,你是對的,我只是注意到我每次在onClick事件中創建一個新的模型對象。謝謝。但是,你能詳細說明我需要在equals()和hashcode()中實現什麼功能嗎? – user3098795

+0

@ user3098795這取決於您的業務邏輯,但您的代碼似乎想要比較'name'屬性。查看[這個答案](http://stackoverflow.com/a/27609/1167210)瞭解如何實現這些方法的一個很好的例子。 – Marcelo

+0

謝謝馬塞洛。我想這會起作用,我會試試這種方式。 – user3098795

0

當從ArrayList除去時,它確定經由equals()方法要除去的對象。默認情況下,這將使用對象標識。但是,刪除的對象是全新的。因此,它不會匹配您收藏的任何元素,也不會刪除任何元素。

恰當地覆蓋equals()NameModel並且您的代碼將正常工作。