Java android中带有复选框的自定义列表视图

Java android中带有复选框的自定义列表视图,java,android,android-listview,nullpointerexception,android-custom-view,Java,Android,Android Listview,Nullpointerexception,Android Custom View,我试图在自定义列表视图中添加复选框,但它给出了NullPointerException错误 这是我的主要活动课 public class Classes extends Activity { ImageView imageViewNewClass; ListView mListView; String[] stg1; List<String[]> names2 = null; DataManipulatorClass dataManipulator; CustomAdapter c

我试图在自定义列表视图中添加复选框,但它给出了NullPointerException错误

这是我的主要活动课

public class Classes extends Activity {

ImageView imageViewNewClass;
ListView mListView;
String[] stg1;
List<String[]> names2 = null;
DataManipulatorClass dataManipulator;
CustomAdapter customAdapter;
public Classes classes = null;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.classes);

    imageViewNewClass = (ImageView) findViewById(R.id.newclass);
    mListView = (ListView) findViewById(R.id.displaydata);

    Resources res =getResources();
    classes = this;
    customAdapter=new CustomAdapter( classes, stg1,res );
    mListView.setAdapter( customAdapter );

    imageViewNewClass.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            Intent intent = new Intent(Classes.this, Class_Create.class);
            startActivity(intent);
        }
    });

    mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View item,
                int position, long id) {
            Toast.makeText(getApplicationContext(),
                    "Listview item clicked", Toast.LENGTH_LONG).show();
        }
    });

    dataManipulator = new DataManipulatorClass(this);
    names2 = dataManipulator.selectAll();

    stg1 = new String[names2.size()];
    int x = 0;
    String stg;

    for (String[] name : names2) {
        stg = "Class Name : " + name[1];
        stg1[x] = stg;
        x++;
    }

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, stg1);

    mListView.setAdapter(new ArrayAdapter<String>(this, R.layout.check,
            stg1));
    mListView.setAdapter(adapter);
    adapter.notifyDataSetChanged();
}
}
公共类扩展活动{
ImageView imageViewNewClass;
列表视图;
字符串[]stg1;
列表名称2=空;
数据操纵器类数据操纵器;
自定义适配器自定义适配器;
公共类=空;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.classes);
imageViewNewClass=(ImageView)findViewById(R.id.newclass);
mListView=(ListView)findViewById(R.id.displaydata);
Resources res=getResources();
类=此;
customAdapter=新的customAdapter(类、stg1、res);
mListView.setAdapter(customAdapter);
imageViewNewClass.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图v){
意向意向=新意向(Class.this,Class\u Create.Class);
星触觉(意向);
}
});
mListView.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
public void onItemClick(AdapterView父项、视图项、,
内部位置,长id){
Toast.makeText(getApplicationContext(),
“单击Listview项”,Toast.LENGTH_LONG.show();
}
});
DataManipular=新的dataManipulator类(此);
names2=DataManipular.selectAll();
stg1=新字符串[names2.size()];
int x=0;
字符串stg;
对于(字符串[]名称:名称2){
stg=“类名:”+名称[1];
stg1[x]=stg;
x++;
}
ArrayAdapter=新的ArrayAdapter(此,
android.R.layout.simple_list_item_1,stg1);
mListView.setAdapter(新阵列适配器)(此,R.layout.check,
stg1);
mListView.setAdapter(适配器);
adapter.notifyDataSetChanged();
}
}
这是我的CustomAdapter类

public class CustomAdapter extends BaseAdapter {

/*********** Declare Used Variables *********/
private Activity activity;
private String[] data;
private static LayoutInflater inflater = null;
public Resources res;
int i = 0;

/************* CustomAdapter Constructor *****************/
public CustomAdapter(Activity a, String[] stg1, Resources resLocal) {

    /********** Take passed values **********/
    activity = a;
    data = stg1;
    res = resLocal;

    /*********** Layout inflator to call external xml layout () ***********/
    inflater = (LayoutInflater) activity
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

}

/******** What is the size of Passed Arraylist Size ************/
public int getCount() {
    if (data.length <= 0)
        return 1;
    return data.length;
}

public Object getItem(int position) {
    return position;
}

public long getItemId(int position) {
    return position;
}

public static class ViewHolder {
    public CheckBox checkBox;
}

public View getView(int position, View convertView, ViewGroup parent) {

    View vi = convertView;
    ViewHolder holder;

    if (convertView == null) {
        vi = inflater.inflate(R.layout.check, null);
        holder = new ViewHolder();
        holder.checkBox = (CheckBox) vi.findViewById(R.id.checkBox1);
        vi.setTag(holder);
    } else
        holder = (ViewHolder) vi.getTag();
    return vi;
}
public void onClick(View v) {
    Log.v("CustomAdapter", "=====Row button clicked=====");
}
}
公共类CustomAdapter扩展了BaseAdapter{
/***********声明使用的变量*********/
私人活动;
私有字符串[]数据;
专用静态充气机=空;
公共资源;
int i=0;
/*************自定义适配器构造函数*****************/
公共CustomAdapter(活动a,字符串[]stg1,资源resLocal){
/**********接受传递的值**********/
活动=a;
数据=stg1;
res=resLocal;
/***********布局充气器调用外部xml布局()***********/
充气器=(充气器)活动
.getSystemService(上下文布局\充气机\服务);
}
/********传递的Arraylist大小是多少************/
public int getCount(){

如果(data.length,您可能忘记在适配器的构造函数中初始化
data
数组

/************* CustomAdapter Constructor *****************/
public CustomAdapter(Activity a, String[] stg1, Resources resLocal) {

/********** Take passed values **********/
activity = a;
data = new String[stg1.length]; //// Add this line
data = stg1;
res = resLocal;
.
.
.




}
在适配器的构造函数中尝试这样做

/************* CustomAdapter Constructor *****************/
public CustomAdapter(Activity a, String[] stg1, Resources resLocal) {

/********** Take passed values **********/
activity = a;
data = new String[stg1.length]; //// Add this line
data = stg1;
res = resLocal;
.
.
.




}

传递给CustomAdapter的字符串数组为空

customAdapter=new CustomAdapter( classes, stg1,res ); // here stg1 is null 

您已经用一个名为“stg1”的字符串数组初始化了自定义适配器,但当您在活动中将其用于此行时,“stg1”本身尚未初始化

customAdapter=new CustomAdapter( classes, stg1,res );
然后,您已经在稍后的位置通过此行初始化了stg1数组

stg1 = new String[names2.size()];

因此,当您第一次在适配器中使用此空对象时,适配器无法确定GetCount方法中的数组大小。这就是为什么会出现空指针异常的原因。

您似乎忘记了在使用适配器之前初始化适配器