![](/img/trans.png)
[英]multiple checkbox, indexOutOfBounds in a custom adapter with listview
[英]CheckBox in ListView populated by Adapter
我已经阅读完有关此问题的内容,但似乎无法解决。
我尝试在根布局块后代中将可焦点和可触摸焦点设置为false。 我无法通过点击复选框来触发事件。
这是事件:
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
CheckBox checkBox = (CheckBox) view.findViewById(R.id.checkbox);
if (checkBox.isChecked())
Toast.makeText(view.getContext(), "TEST", Toast.LENGTH_SHORT).show();
}
});
我膨胀的布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#ECF0F1">
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/category_picture"
android:layout_width="70dp"
android:layout_height="60dp"
android:background="@drawable/sm_profile"/>
<TextView
android:id="@+id/filter_category"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toRightOf="@+id/category_picture"
android:padding="10dp"
android:text="Party"
android:textColor="@color/enloop_dark_gray"
android:textSize="18dp"/>
<CheckBox
android:id="@+id/checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"/>
</RelativeLayout>
</RelativeLayout>
</RelativeLayout>
适配器类:
public class FilterAdapter extends BaseAdapter {
private Context mContext;
private ArrayList<String> mFilters;
private ArrayList<Integer> mPictures;
private Typeface Bebas, DroidSans;
public FilterAdapter(Context context, ArrayList<String> filters, ArrayList<Integer> pictures) {
this.mContext = context;
this.mFilters = filters;
this.mPictures = pictures;
}
@Override
public int getCount() {
return mFilters.size();
}
@Override
public Object getItem(int position) {
return mFilters.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater mInflater = (LayoutInflater)
mContext.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
convertView = mInflater.inflate(R.layout.category_filter_item, null);
}
DroidSans = Typeface.createFromAsset(mContext.getAssets(), "fonts/DroidSans.ttf");
ImageView filter_img = (ImageView) convertView.findViewById(R.id.category_picture);
TextView filter_category = (TextView) convertView.findViewById(R.id.filter_category);
CheckBox checkBox = (CheckBox) convertView.findViewById(R.id.checkboxes);
filter_category.setTypeface(DroidSans);
filter_category.setText(mFilters.get(position));
filter_img.setBackgroundResource(mPictures.get(position));
return convertView;
}
片段的主要XML:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.enloop.Fragments.DrawerFragments.Filter.CheckinFilters">
<RelativeLayout
android:id="@+id/select_category_action_bar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@color/action_color">
<RelativeLayout
android:id="@+id/left_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/menu_btn_from_maps"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:background="@drawable/ab_icon_menu"/>
<ImageView
android:id="@+id/enloop_logo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/menu_btn_from_maps"
android:background="@drawable/ab_logo"/>
</RelativeLayout>
<RelativeLayout
android:id="@+id/center_layout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_toLeftOf="@+id/right_layout"
android:layout_toRightOf="@+id/left_layout">
<SearchView
android:id="@+id/filter_categories"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:background="@android:color/transparent"
android:queryHint="Search"/>
</RelativeLayout>
<RelativeLayout
android:id="@+id/right_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true">
<RelativeLayout
android:id="@+id/check_in_lay"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageButton
android:id="@+id/check_in_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/ab_icon_checkins"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignRight="@id/check_in_image"
android:layout_alignTop="@+id/check_in_image"
android:layout_marginRight="3dp"
android:layout_marginTop="5dp"
android:background="@drawable/notifications_status"
android:gravity="center"
android:text="3"
android:textColor="@color/common_signin_btn_dark_text_default"
android:textSize="6dp"/>
</RelativeLayout>
<RelativeLayout
android:id="@+id/message_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/check_in_lay">
<ImageButton
android:id="@+id/message_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/ab_icon_message"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignRight="@id/message_image"
android:layout_alignTop="@+id/message_image"
android:layout_marginRight="3dp"
android:layout_marginTop="5dp"
android:background="@drawable/notifications_status"
android:gravity="center"
android:text="2"
android:textColor="@color/common_signin_btn_dark_text_default"
android:textSize="6dp"/>
</RelativeLayout>
<RelativeLayout
android:id="@+id/notification_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/message_layout">
<ImageButton
android:id="@+id/notification_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/ab_icon_notification"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignRight="@id/notification_image"
android:layout_alignTop="@+id/notification_image"
android:layout_marginRight="3dp"
android:layout_marginTop="5dp"
android:background="@drawable/notifications_status"
android:gravity="center"
android:text="17"
android:textColor="@color/common_signin_btn_dark_text_default"
android:textSize="6dp"/>
</RelativeLayout>
</RelativeLayout>
</RelativeLayout>
<RelativeLayout
android:id="@+id/filter_layout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/select_category_action_bar">
<TextView
android:id="@+id/filters_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:gravity="start|center_vertical"
android:padding="20dp"
android:text="CHECK-IN FILTERS"
android:textColor="@color/enloop_dark_gray"
android:textSize="30dp"
android:textStyle="bold"/>
</RelativeLayout>
<ListView
android:id="@+id/filter_list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_below="@+id/filter_layout"
android:background="#ECF0F1"/>
</RelativeLayout>
将适配器设置为ListView:
mListView = (ListView) view.findViewById(R.id.filter_list);
filterAdapter = new FilterAdapter(view.getContext(), l, drawables);
mListView.setAdapter(filterAdapter);
尝试像这样在适配器的getView
方法中的复选框本身上添加onClickListener
:
CheckBox checkBox = (CheckBox) view.findViewById(R.id.checkbox);
checkBox .setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (checkBox.isChecked())
Toast.makeText(view.getContext(), "TEST", Toast.LENGTH_SHORT).show();
}
});
编辑:
您的getView
方法应如下所示:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater mInflater = (LayoutInflater)
mContext.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
convertView = mInflater.inflate(R.layout.category_filter_item, null);
}
DroidSans = Typeface.createFromAsset(mContext.getAssets(), "fonts/DroidSans.ttf");
ImageView filter_img = (ImageView) convertView.findViewById(R.id.category_picture);
TextView filter_category = (TextView) convertView.findViewById(R.id.filter_category);
CheckBox checkBox = (CheckBox) convertView.findViewById(R.id.checkbox);
checkBox .setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (checkBox.isChecked())
Toast.makeText(view.getContext(), "TEST", Toast.LENGTH_SHORT).show();
}
});
filter_category.setTypeface(DroidSans);
filter_category.setText(mFilters.get(position));
filter_img.setBackgroundResource(mPictures.get(position));
return convertView;
}
尝试实现onCheckChange Listener而不是Item Click Listener:
checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked){
Toast.makeText(view.getContext(),"Test", Toast.LENGTH_SHORT).show();
}
}
});
带有ViewHolder模式的固定适配器代码:
public class FilterAdapter extends BaseAdapter {
private Context mContext;
private ArrayList<String> mFilters;
private ArrayList<Integer> mPictures;
public FilterAdapter(Context context, ArrayList<String> filters, ArrayList<Integer> pictures) {
this.mContext = context;
this.mFilters = filters;
this.mPictures = pictures;
}
@Override
public int getCount() {
return mFilters.size();
}
@Override
public Object getItem(int position) {
return mFilters.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = LayoutInflater.from(mContext).inflate(R.layout.category_filter_item, null);
holder.filter_img = (ImageView) convertView.findViewById(R.id.category_picture);
holder.filter_category = (TextView) convertView.findViewById(R.id.filter_category);
holder.checkBox = (CheckBox) convertView.findViewById(R.id.checkbox);
holder.filter_category.setTypeface(Typeface.createFromAsset(mContext.getAssets(), "fonts/DroidSans.ttf"));
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}
holder.filter_category.setText(mFilters.get(position));
holder.filter_img.setBackgroundResource(mPictures.get(position));
holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked){
Toast.makeText(view.getContext(), "Item at " + position + " is Checked", Toast.LENGTH_SHORT).show();
}
}
});
return convertView;
}
class ViewHolder{
ImageView filter_img;
TextView filter_category;
CheckBox checkBox;
}
}
问题是您在getView()
方法中使用时, inflated
视图的ID为Checkbox
is checkbox
CheckBox checkBox = (CheckBox) convertView.findViewById(R.id.checkboxes);// this is wrong.
所以你需要通过
CheckBox checkBox = (CheckBox) convertView.findViewById(R.id.checkbox);
在getView()
方法中或仅在category_filter_item.xml
文件中,将Checkbox
ID更改为checkboxes
。
这不在Adapter类中。 请参阅此处的ID。
CheckBox checkBox = (CheckBox) view.findViewById(R.id.check_box);
checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(v.getContext(), "TEST", Toast.LENGTH_SHORT).show();
}
});
过滤器类别中的ID:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater mInflater = (LayoutInflater)
mContext.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
convertView = mInflater.inflate(R.layout.category_filter_item, null);
}
DroidSans = Typeface.createFromAsset(mContext.getAssets(), "fonts/DroidSans.ttf");
ImageView filter_img = (ImageView) convertView.findViewById(R.id.category_picture);
TextView filter_category = (TextView) convertView.findViewById(R.id.filter_category);
CheckBox checkBox = (CheckBox) convertView.findViewById(R.id.check_box);
错误:
java.lang.NullPointerException
at com.enloop.Fragments.DrawerFragments.Filter.CheckinFilters.onCreateView(CheckinFilters.java:104)
这正是我要设置活动的地方。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.