自定义适配器复选框侦听器nullpointer异常

时间:2013-12-04 15:31:39

标签: android listview adapter

我正在尝试在我为listview制作的自定义适配器中实现一个复选框监听器。

public class CustomAdapter extends ArrayAdapter<String> {

private Activity activity;
private List<String> items;
private LayoutInflater inflater = null;

public CustomAdapter(Activity a, int resource, List<String> i) {
    super(a, resource, i);
    activity = a;
    items = i;
    inflater = (LayoutInflater) a.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

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

    if (vi == null) {
        vi = inflater.inflate(android.R.layout.simple_list_item_multiple_choice, parent, false);
    }

    //View itemName = (CheckedTextView) convertView.findViewById(R.id.text1);
//  View checkBox = (CheckBox) convertView.findViewById(R.id.text1);

   // TextView itemName = (TextView) convertView.findViewById(R.id.text1);
    CheckedTextView checkbox = (CheckedTextView) convertView.findViewById(android.R.id.text1);
    Log.d("test", "testing");
    ((CheckedTextView) (checkbox)).setOnClickListener(new OnClickListener() {
        public void onClick(View view){
            CheckBox c = (CheckBox) view;
            Log.d("Test", "testing2");
        }
    });

    return vi;

}

}

对代码进行了一些更改,现在我在我定义checktextview的行上收到了一个N​​PE。

12-05 15:09:02.241:E / AndroidRuntime(29134):java.lang.NullPointerException 12-05 15:09:02.241:E / AndroidRuntime(29134):at com.example.mercbisandroid.CustomAdapter.getView(CustomAdapter.java:41) 12-05 15:09:02.241:E / AndroidRuntime(29134):在android.widget.AbsListView.obtainView(AbsListView.java:2263)

3 个答案:

答案 0 :(得分:1)

看一下android.R.layout.simple_list_item_multiple_choice的来源(这就是你要膨胀的):

<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:gravity="center_vertical"
    android:checkMark="?android:attr/listChoiceIndicatorMultiple"
    android:paddingLeft="6dip"
    android:paddingRight="6dip"
/>

下面的这一行会导致null(因此当你尝试附加一个监听器时你的后续NPE)因为在上面的布局中没有任何id:

CheckBox checkbox = (CheckBox) convertView.findViewById(R.id.text1);

正确使用的ID是:

CheckedTextView checked_tv = (CheckedTextView) convertView.findViewById(android.R.id.text1);

请注意,您无法将CheckedTextView强制转换为CheckBox。因此,要么使用您从此布局获得的CheckedTextView,要么根据您的喜好对您自己的包含CheckBox的布局进行扩充。

答案 1 :(得分:0)

CheckBox不是CheckBox,而是TextView,因为您使用与itemName相同的资源ID来调用findViewById

答案 2 :(得分:0)

R.id.text1是TextView或CheckBox。我的意思是它的顺序是相同的:如果是TextView,它不是CheckBox。

TextView itemName = (TextView) convertView.findViewById(R.id.text1);
CheckBox checkbox = (CheckBox) convertView.findViewById(R.id.text1);