2017-05-08 4 views
0

Hallo Ich habe eine Liste mit meinem benutzerdefinierten Adapter erstellt. Jede Zeile hat Kontrollkästchen, TextView, TextView. In meinem Adapter habe ich die Methode onCheckedChanged ovovided. Wenn ich Toast auf jeden Klick-Punkt überprüfe, funktioniert es wie es soll, aber wenn ich in der Hauptaktivität ausgewählte Elemente löschen möchte, lösche ich immer nur das letzte Element. Kann mir jemand einen Tipp geben? Hier ist mein Adapter CodeCheckBox onCheckedChanged funktioniert nicht richtig

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

und meine Löschaktion

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

auf diese Weise gebe ich Daten

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

Antwort

0

Ändern der Logik wie diese,

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(); Gibt das Objekt zurück, wenn ich zu int wechseln will: (int) buttonView.getTag(); App funktioniert nicht mehr –

+0

vielleicht ist es null. Haben Sie den Tag für beide Fälle festgelegt? – Krish

+0

Ja, wenn row == null holder.checkBox.setTag (position); und sonst ((RowBeanHolder) row.getTag()). checkBox.setTag (position); –