2012-04-07 12 views
9

Ich versuche eine OnCheckedChangeListener auf eine CheckBox zu setzen, aber meine Anwendung wird in der Laufzeit beendet. Ich habe auch versucht, Hörer für meine TextView zu setzen und ich bekomme immer noch das gleiche Ergebnis. Kann jemand helfen?OnCheckedChangeListener kann nicht auf eine Checkbox gesetzt werden

import android.app.ListActivity; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.DialogInterface.OnClickListener; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.ArrayAdapter; 
import android.widget.CheckBox; 
import android.widget.CompoundButton; 
import android.widget.CompoundButton.OnCheckedChangeListener; 
import android.widget.ImageView; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 

public class ListViewActivity extends ListActivity implements OnCheckedChangeListener { 

TextView label; 
CheckBox checkBox; 

public class MyCustomAdapter extends ArrayAdapter<String> { 


public MyCustomAdapter(Context context, int textViewResourceId, 
String[] objects) { 
super(context, textViewResourceId, objects); 

// TODO Auto-generated constructor stub 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
// TODO Auto-generated method stub 
//return super.getView(position, convertView, parent); 

View row = convertView; 

if(row==null){ 
LayoutInflater inflater=getLayoutInflater(); 
row=inflater.inflate(R.layout.main, parent, false); 

} 


label=(TextView)row.findViewById(R.id.weekofday); 
label.setText(month[position]); 
checkBox=(CheckBox)row.findViewById(R.id.checkBox); 


return row; 
} 
} 

String[] month = { 
"January", "February", "March", "April", 
"May", "June", "July", "August", 
"September", "October", "November", "December" 
}; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
// setContentView(R.layout.main); 
/*setListAdapter(new ArrayAdapter<String>(this, 
    R.layout.row, R.id.weekofday, DayOfWeek));*/ 


    setListAdapter(new MyCustomAdapter(ListViewActivity.this, R.layout.main, month)); 

    checkBox.setOnCheckedChangeListener(this); //my application exits here!!!! 

} 





@Override 
public void onCheckedChanged(CompoundButton arg0, boolean arg1) { 
// TODO Auto-generated method stub 
//Toast.makeText(getApplicationContext(), "box checked", Toast.LENGTH_LONG); 

} 


} 

Antwort

12

Sie können die Zuhörer für Ihre CheckBox vom ListView so gesetzt (es wird wahrscheinlich eine NullPointerException werfen), setzen Sie stattdessen den Hörer in der getView() Methode (Sie werden auch die CheckBox Status halten müssen Sie enden also nicht mit dem Status einer komischen Zeile. Bellow ist ein Beispiel:

public class ListViewActivity extends ListActivity { 

    public class MyCustomAdapter extends ArrayAdapter<String> { 

     private ArrayList<Boolean> status = new ArrayList<Boolean>(); 

     public MyCustomAdapter(Context context, int textViewResourceId, 
       String[] objects) { 
      super(context, textViewResourceId, objects); 
      for (int i = 0; i < objects.length; i++) { 
       status.add(false); 
      } 
     } 

     @Override 
     public View getView(final int position, View convertView, 
       ViewGroup parent) { 
      View row = convertView; 
      if (row == null) { 
       LayoutInflater inflater = getLayoutInflater(); 
       row = inflater.inflate(R.layout.adapters_listviewactivity_row, 
         parent, false); 
      } 

      TextView label = (TextView) row.findViewById(R.id.weekofday); 
      label.setText(month[position]); 
      CheckBox checkBox = (CheckBox) row.findViewById(R.id.checkBox); 
      checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

       @Override 
       public void onCheckedChanged(CompoundButton buttonView, 
         boolean isChecked) { 
        Toast.makeText(getApplicationContext(), "" + position, 
          Toast.LENGTH_SHORT).show(); 
        if (isChecked) { 
         status.set(position, true); 
        } else { 
         status.set(position, false); 
        } 
       } 
      }); 
      checkBox.setChecked(status.get(position)); 
      return row; 
     } 
    } 

    String[] month = { "January", "February", "March", "April", "May", "June", 
      "July", "August", "September", "October", "November", "December" }; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setListAdapter(new MyCustomAdapter(ListViewActivity.this, 
       R.layout.main, month)); 
    } 

} 

Für die TextView Sie die gleiche Sache zu tun haben.

+0

Danke .... Das funktionierte :) –

2

Implementieren CheckBox Listener für Ihre Klasse auf diese Weise, vor allem, wenn Sie mehr als eine CheckBox zu tun haben, können Sie in Schaltergehäuse Blöcke verarbeiten kann und macht den Code ordentlicheres:

public class MyClass extends AppCompatActivity implements 
    CompoundButton.OnCheckedChangeListener,{ 

     CheckBox myCheckBox; 
    } 

In Ihrem onCreate() Methode setzen diese:

myCheckBox = (CheckBox)findViewById(R.Id.myCheckBoxName_in_XML_layout); 
    mmyCheckBox.setOnCheckedChangeListener(this); 

listern für Ihre Checkbox view-Ereignis wie folgt aus:

@Override 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 

    switch (buttonView.getId()){ 
     case R.id.myCheckBoxName_in_XML_layout: 

      if(isChecked == true) { 
       Toast.makeText(this, "Checked", Toast.LENGTH_SHORT).show(); 
      } else{ 
        Toast.makeText(this, "Unchecked", Toast.LENGTH_SHORT).show(); 
        } 

      break; 
     } 

     } 
0
public class MainActivity extends AppCompatActivity implements CompoundButton.OnCheckedChangeListener { 
List<String> mList = new ArrayList<>(); 
CheckBox android, java, python, php, unity3D; 
Button submitButton; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    android = (CheckBox) findViewById(R.id.androidCheckBox); 
    android.setOnCheckedChangeListener(this); 
    java = (CheckBox) findViewById(R.id.javaCheckBox); 
    java.setOnCheckedChangeListener(this); 
    python = (CheckBox) findViewById(R.id.pythonCheckBox); 
    python.setOnCheckedChangeListener(this); 
    php = (CheckBox) findViewById(R.id.phpCheckBox); 
    php.setOnCheckedChangeListener(this); 
    unity3D = (CheckBox) findViewById(R.id.unityCheckBox); 
    unity3D.setOnCheckedChangeListener(this); 

    submitButton = (Button) findViewById(R.id.submitButton); 
    submitButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Log.e("ArrayList Values*******",mList.toString()); 
     } 
    }); 

} 

@Override 
public void onCheckedChanged(CompoundButton compoundButton, boolean b) { 
    switch (compoundButton.getId()) { 
     case R.id.androidCheckBox: 
      if (android.isChecked()) { 
       mList.add(String.valueOf(android.getText())); 
       Log.e("Android*******",mList.toString()); 
      } 
      else { 
        mList.remove(android.getText()); 
      } 
      break; 

     case R.id.javaCheckBox: 
      if (java.isChecked()) { 
       mList.add(String.valueOf(java.getText())); 
       Log.e("Java*******",mList.toString()); 
      } 
      else { 
       mList.remove(java.getText()); 
      } 
      break; 

     case R.id.phpCheckBox: 
      if (php.isChecked()) { 
       mList.add(String.valueOf(php.getText())); 
       Log.e("PHP*******",mList.toString()); 
      } 
      else { 
       mList.remove(php.getText()); 
      } 
      break; 

     case R.id.pythonCheckBox: 
      if (python.isChecked()){ 
       mList.add(String.valueOf(python.getText())); 
       Log.e("Python*******",mList.toString()); 
      } 
      else { 
       mList.remove(python.getText()); 
      } 
      break; 

     case R.id.unityCheckBox: 
      if (unity3D.isChecked()){ 
       mList.add(String.valueOf(unity3D.getText())); 
       Log.e("Unity*******",mList.toString()); 
      } 
      else { 
       mList.remove(unity3D.getText()); 
      } 
      break; 
     } 
    } 
} 
+0

Ja, ich habe diesen Code getan –

Verwandte Themen