2012-04-07 68 views
9

我试图将OnCheckedChangeListener设置为CheckBox,但我的应用程序在运行时退出。我也尝试为我的TextView设置听众,我仍然得到相同的结果。谁能帮忙?无法将OnCheckedChangeListener设置为复选框

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

} 


} 

回答

12

不能从ListView这样设置监听器为您CheckBox(它可能会抛出一个NullPointerException),而不是设置听者在getView()方法(你也必须保持CheckBox状态所以你不会以奇怪的行状态结束)。贝娄是一个例子:

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

} 

对于TextView你必须做同样的事情。

+0

感谢....这工作:) – 2012-04-07 20:33:50

2

实现复选框监听器类这种方式,特别是如果你有一个以上的复选框来处理,你可以在开关的情况下块处理,使你的代码更简洁:

public class MyClass extends AppCompatActivity implements 
    CompoundButton.OnCheckedChangeListener,{ 

     CheckBox myCheckBox; 
    } 

在你onCreate()方法把这个:

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

Listern为你这样的复选框查看事件:

@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

是的,我已经做到了这码 – 2017-08-30 06:54:39