Невозможно установить OnCheckedChangeListener в флажок

Я пытаюсь установить OnCheckedChangeListener на CheckBox, но мое приложение завершает работу во время выполнения. Я также пытался установить слушателей для моего TextView, и я все равно получаю тот же результат. Может ли кто-нибудь помочь?

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

}


}

Ответ 1

Вы не можете установить прослушиватель для CheckBox из ListView, как это (он, вероятно, выбросит 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 вам нужно будет сделать то же самое.

Ответ 2

Внедрите ListBox Listener для своего класса таким образом, особенно если у вас есть более чем одна CheckBox, с которой вы можете иметь дело, вы можете обрабатывать блоки блоков case и сделать ваш код более аккуратным:

 public class MyClass extends AppCompatActivity implements
    CompoundButton.OnCheckedChangeListener,{

      CheckBox myCheckBox;
  }

В вашем методе onCreate() поставьте это:

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

Listern для вашего события вида checkbox следующим образом:

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

      }

Ответ 3

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