2017-05-08 76 views
0

你好我已經用我的自定義適配器創建了一個List。每一行都有複選框,textView,textView。在我的適配器中,我使用了ovcked方法onCheckedChanged。當我將Toast檢查每個點擊項目的狀態時,它應該像它應該那樣工作,但是當我想在主要活動中刪除所選項目時,它總是刪除我最後一個元素。有人可以給我一個小費嗎?這裏是我的適配器代碼CheckBox onCheckedChanged無法正常工作

public View getView(final int position, final View convertView, ViewGroup parent) { 
     View row = convertView; 
     if(row == null) 
     { 
      LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
      row = inflater.inflate(resource, parent, false); 

      holder = new RowBeanHolder(); 
      holder.txtTitle=(TextView) row.findViewById(R.id.name); 
      holder.indicator=(TextView) row.findViewById(R.id.indicator); 
      holder.checkBox=(CheckBox) row.findViewById(R.id.checkBoxDelete); 
      holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
       @Override 
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
        ProductList element=(ProductList) holder.checkBox.getTag(); 
        element.setSelected(isChecked); 
        //Toast.makeText(context,element.getSelected(),Toast.LENGTH_SHORT).show(); it show my current state 
       } 
      }); 
      row.setTag(holder); 
      holder.checkBox.setTag(data.get(position)); 
     } 
     else 
     { 
      holder = (RowBeanHolder)row.getTag(); 
      ((RowBeanHolder) row.getTag()).checkBox.setTag(data.get(position)); 

     } 

     if(longPressed){ 
      showCheckbox(); 
     } 
     else{ 
      hideCheckbox(); 
      uncheck(); 
     } 

     ProductList object = data.get(position); 
     holder.txtTitle.setText(object.getName()); 
     holder.indicator.setText(object.getToBuy() + "/" + object.getBought()); 
     holder.checkBox.setChecked(data.get(position).isSelected()); 

     return row; 
    } 

,並以這種方式我刪除操作

public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
     switch (item.getItemId()){ 
      case R.id.action_delete: 
       for(ProductList p:items){ 
        if(p.isSelected()) items.remove(p); 
       } 
       mode.finish(); 
       return true; 
      default: return false; 
     } 
    } 

我通過數據

adapter = new RowAdapter(context,R.layout.row,items); 
        listView.setAdapter(adapter); 

回答

0

改變這樣的邏輯,

public View getView(final int position, final View convertView, ViewGroup parent) { 
     View row = convertView; 


     RowBeanHolder holder; 
     if(row == null) 
     { 
      LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
      row = inflater.inflate(resource, parent, false); 

      holder = new RowBeanHolder(); 
      holder.txtTitle=(TextView) row.findViewById(R.id.name); 
      holder.indicator=(TextView) row.findViewById(R.id.indicator); 
      holder.checkBox=(CheckBox) row.findViewById(R.id.checkBoxDelete); 
      holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
       @Override 
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
        int itemPos = buttonView.getTag(); 
        ProductList element = data.get(itemPos); 
        element.setSelected(isChecked); 
        //Toast.makeText(context,element.getSelected(),Toast.LENGTH_SHORT).show(); it show my current state 
       } 
      }); 
      row.setTag(holder); 
      holder.checkBox.setTag(position); 
     } 
     else 
     { 
      holder = (RowBeanHolder)row.getTag(); 
      ((RowBeanHolder) row.getTag()).checkBox.setTag(position); 

     } 

     if(longPressed){ 
      showCheckbox(); 
     } 
     else{ 
      hideCheckbox(); 
      uncheck(); 
     } 

     ProductList object = data.get(position); 
     holder.txtTitle.setText(object.getName()); 
     holder.indicator.setText(object.getToBuy() + "/" + object.getBought()); 
     holder.checkBox.setChecked(data.get(position).isSelected()); 

     return row; 
    } 
+0

buttonView。 getTag();當我想要更改爲int時返回Object:(int)buttonView.getTag();應用停止工作 –

+0

也許它是空的。你是否爲這兩種情況設置了標籤? – Krish

+0

是,如果row == null holder.checkBox.setTag(position); ((RowBeanHolder)row.getTag())。checkBox.setTag(position); –