2016-06-03 5 views
0

Ich habe ein Array von toggleButtons. Es gibt ein 1: 1-Verhältnis von toggleButtons mit der Anzahl der Zeilen in einem Cursor. Ich weise jedem toggleButton im Array eine setId() mit zurückgegebenen Daten vom Cursor zu.Eine Toast-Nachricht in einer setOnCheckedChangeListener-Methode ausführen

Mein Update aktualisiert immer 1 Zeile im Cursor und ich versuche, dieses Problem mit einigen Toast-Nachrichten zu beheben. Das Problem ist, dass ich die Toast-Nachricht nicht anzeigen kann. Ich weiß die Methode ist Listener feuert, weil meine SQL-Update ausgeführt wird, ist es nur, dass es die falsche Zeile ist. Hier ist mein Code.

toggleButton[i].setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() 
     { 
      ContentValues values = new ContentValues(); //Create the new content values object for data input 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) 
      { 
       if(isChecked) 
       { 
        Toast.makeText(Cart.this.getBaseContext(), "hello", Toast.LENGTH_SHORT).show(); 
        toggleButton[buttonView.getId()].setTextOn("Yes"); //Set the text when the button changes state to on 
        values.put(Contract.ItemsTable.COLUMN_ONE, 1); //Update the record on the 'status' column to true 
        String[] itemId = {String.valueOf(buttonView.getId())}; // 
        db.update(Contract.ItemsTable.TABLE_NAME, values, SmartCartContract.ItemsTable.COLUMN_ITEM_ID + " LIKE ?", itemId); //Update the DB record 
       } else 
       { 
        Toast.makeText(Cart.this.getBaseContext(), "hello", Toast.LENGTH_SHORT).show(); 
        toggleButton[buttonView.getId()].setTextOff("No"); //Set the text when the button changes state to off 
        values.put(SmartCartContract.ItemsTable.COLUMN_TWO, 0); //Update the record on the 'status' column to false 
        String[] itemId = {String.valueOf(buttonView.getId())}; // 
        db.update(Contract.ItemsTable.TABLE_NAME, values, Contract.ItemsTable.COLUMN_ITEM_ID + " LIKE ?", itemId); //Update the DB record 
       } 
      } 
     }); 

Cart.this.getBaseContext() ist mein letzter Versuch der Optionen, die ich zu verwenden, habe gesehen, zu. Mache ich das falsch?

Ich baue die Tasten dynamisch mit:

toggleButton[i] = new ToggleButton(this); //Create new ToggleButton control for this row  
toggleButton[i].setGravity(Gravity.CENTER); //Align the text in the middle 
toggleButton[i].setId(cursor.getInt(cursor.getColumnIndex("itemId"))); 
if (cursor.getInt(cursor.getColumnIndex("itemInCart")) == 1) //Check if marked 'in Cart' 
+0

Sie könnten Toast nur den isChecked Wert sofort, keinen Grund, die gleiche Zeile zweimal –

+0

@ cricket_007 zu kopieren - danke für die Antwort. Ich hatte es tatsächlich dort und es hat auch nicht gefeuert. Ich habe es nur zur Fehlerbehebung nach innen verlegt und dann habe ich den Beitrag erstellt –

+0

Außerdem suche ich nicht nach dem booleschen Wert. Dieser Teil funktioniert (Zuweisung der 0 und der 1). Ich aktualisiere die falsche Zeile in der Datenbank, nicht den falschen Wert in der Spalte. –

Antwort

1

nicht sicher, was das Problem mit der Datenbank, aber hier ist ein minimales Beispiel für einige ToggleButtons mit einem Arbeits Toast.

public class CartActivity extends AppCompatActivity { 

    private CompoundButton.OnCheckedChangeListener listener = new CompoundButton.OnCheckedChangeListener() { 

     ContentValues cv; 

     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      cv = new ContentValues(); 
      String key; 
      int val; 

      if (isChecked) { 
       key = "col1"; 
       val = 1; 
      } else { 
       key = "col2"; 
       val = 0; 
      } 

      cv.put(key, val); 
      String[] itemId = {String.valueOf(buttonView.getId())}; 
      Toast.makeText(CartActivity.this, 
        String.format("[%d] %s {%s}", buttonView.getId(), isChecked, cv), 
        Toast.LENGTH_SHORT).show(); 
     } 
    }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     LinearLayout view = new LinearLayout(this); 
     view.setOrientation(LinearLayout.VERTICAL); 

     LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
        ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); 

     ToggleButton[] buttons = new ToggleButton[3]; 
     for (int i = 0; i < buttons.length; i++) { 
      ToggleButton toggle = new ToggleButton(this); 

      toggle.setLayoutParams(lp); 
      toggle.setId(i); 
      toggle.setGravity(Gravity.CENTER);    
      toggle.setTextOn(String.format("On [%d]", i)); 
      toggle.setTextOff(String.format("Off [%d]", i)); 
      toggle.setChecked(false); 
      toggle.setOnCheckedChangeListener(listener); 

      buttons[i] = toggle; 
      view.addView(toggle); 
     } 

     setContentView(view); 
    } 
} 
+0

Vielen Dank für das Posten dieses @ Cricket_007.Ich werde es heute versuchen.Wissen Sie, ob die Code-Snippets vollständig funktionieren? Mit meinem Code oben, legte ich meinen Text auf "JA" und "NEIN" aber wann Die Tasten werden angeklickt, sie wechseln zu "ON" und "OFF", was der Standard ist. –

+0

Ich kopiere das direkt von Android S Tudio. Sie sollten nur die Aktivität des Manifests hinzufügen –

+0

Erstaunlich und vielen Dank dafür! –

0

nicht sicher, welche Art von Objekt Warenkorb ist. Aber Sie könnten die Application-Klasse erweitern und den Anwendungskontext speichern, den Sie dann in Ihren Toasts verwenden könnten.

import android.app.Application; 
import android.content.Context; 
import android.content.pm.PackageInfo; 
import android.content.pm.PackageManager; 

public class BaseApplication extends Application 
{ 
    protected static Context context; 
    protected static PackageInfo packageInfo; 
    protected static BaseApplication baseApplication; 

    @Override 
    public void onCreate() 
    { 
     try 
      { 

       baseApplication = this; 

       context = getApplicationContext(); 

       PackageManager manager = context.getPackageManager(); 
       String packageName = context.getPackageName(); 

       packageInfo = manager.getPackageInfo(packageName, 0); 
      } 
     catch (Exception e) 
      { 
       // ignore 
      } 
    } 

    public static Context getContext() 
    { 
     return context; 
    } 

    public static PackageInfo getPackageInfo() 
    { 
     return packageInfo; 
    } 

    public static BaseApplication getApplication(){ 
     return baseApplication; 
    } 
} 
+0

public class Cart extends AppCompatActivity –

+0

Vielleicht gehe ich ein Taubenloch hinunter. Das eigentliche Problem ist, dass ich die falsche Zeile um eine Position im Cursor aktualisiere und ich versuche zu sehen, warum. –

+0

Dann brauchen Sie nur Toast.makeTest (Cart.this, etc ... – dvallejo