我正在尝试在我为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的行上收到了一个NPE。
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)
答案 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);