列表包含checkBox错位以及选中事件
2016-10-09 13:21
190 查看
效果图:
列表项使用了ExpandableTextView,在上一篇博客中提到了用法和使用中遇到的坑:使用ExpandableTextView遇到的坑,在列表中,包含了checkBox,比较容易出现的问题就是在列表中,选中项会错位,原因参照资料:Android ListView CheckBox状态错乱。我在程序中使用了Map来保存是否选中的状态,第二个问题就是点击事件,如果写在setOnCheckedChangeListener中处理,每次滑动时,就会调用,理论上应该是点击的时候再进行操作,所以把处理逻辑写在了setOnClickListener里,错误代码:
正确的代码:
Activity代码:
列表项布局文件:
signservice_item1.xml
signservice_item2.xml
列表项使用了ExpandableTextView,在上一篇博客中提到了用法和使用中遇到的坑:使用ExpandableTextView遇到的坑,在列表中,包含了checkBox,比较容易出现的问题就是在列表中,选中项会错位,原因参照资料:Android ListView CheckBox状态错乱。我在程序中使用了Map来保存是否选中的状态,第二个问题就是点击事件,如果写在setOnCheckedChangeListener中处理,每次滑动时,就会调用,理论上应该是点击的时候再进行操作,所以把处理逻辑写在了setOnClickListener里,错误代码:
viewHolder2.checkBoxSignService.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { isChecks.put(position,isChecked); if(isChecked){ totalPrice += priceList.get(position); checkCount++; }else{ totalPrice -= priceList.get(position); checkCount--; } tvNotice.setText("您总共选择"+checkCount+"项服务,总价共"+totalPrice+"元/年"); } });
正确的代码:
Activity代码:
public class SignServiceActivity extends BaseCompatActivity { @BindView(R.id.tv_sure) TextView tvSure; @BindView(R.id.toolbar) Toolbar toolbar; @BindView(R.id.lv_signservice) ListView lvSignservice; @BindView(R.id.tv_notice) TextView tvNotice; @BindView(R.id.activity_sign_service) LinearLayout activitySignService; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sign_service); ButterKnife.bind(this); toolbar.setNavigationIcon(R.mipmap.ic_navigation); toolbar.setTitle(R.string.health_data); toolbar.setTitleTextAppearance(this, R.style.Theme_ToolBar_Base_Title);//修改主标题的外观,包括文字颜色,文字大小等 toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { SignServiceActivity.this.finish(); } }); tvNotice.setText("您总共选择0项服务,总价共0元/年"); lvSignservice.setAdapter(new SingServiceAdapter(SignServiceActivity.this)); } private class SingServiceAdapter extends BaseAdapter{ Context mContext; LayoutInflater inflater; private final SparseBooleanArray mCollapsedStatus; final int TYPE_1 = 0; final int TYPE_2 = 1; private final String[] sampleStrings; //标记checkBox是否选中 private final Map<Integer,Boolean> isChecks = new HashMap<>(); //测试价格 private ArrayList<Double> priceList = new ArrayList<>(); //计算总价格 private Double totalPrice = 0.0; //选择几项 private int checkCount = 0; //各个布局的控件资源 class ViewHolder1 { TextView textViewTitle; } class ViewHolder2 { CheckBox checkBoxSignService; ExpandableTextView expandableTextView; TextView textViewPrice; } public SingServiceAdapter(Context mContext) { this.mContext = mContext; inflater = LayoutInflater.from(mContext); mCollapsedStatus = new SparseBooleanArray(); sampleStrings = mContext.getResources().getStringArray(R.array.sampleStrings); for (int i = 0;i < sampleStrings.length;i++){ isChecks.put(i,false); priceList.add(i*1.0); } } @Override public int getCount() { return sampleStrings.length; } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(final int position, View convertView, ViewGroup parent) { int type = getItemViewType(position); ViewHolder1 viewHolder1 = null; ViewHolder2 viewHolder2 = null; if (convertView == null) { if (type == TYPE_1) { convertView = LayoutInflater.from(mContext).inflate(R.layout.signservice_item1, null); viewHolder1 = new ViewHolder1(); viewHolder1 .textViewTitle = (TextView) convertView.findViewById(R.id.tv_title); convertView.setTag(viewHolder1); } else if (type == TYPE_2) { viewHolder2 = new ViewHolder2(); convertView = LayoutInflater.from(mContext).inflate(R.layout.signservice_item2, null); viewHolder2.checkBoxSignService = (CheckBox) convertView.findViewById(R.id.cb_signService); viewHolder2.expandableTextView = (ExpandableTextView) convertView.findViewById(R.id.expand_text_view); viewHolder2.textViewPrice = (TextView) convertView.findViewById(R.id.tv_price); convertView.setTag(viewHolder2); } } else { if (type == TYPE_1) { viewHolder1 = (ViewHolder1) convertView.getTag(); } else if (type == TYPE_2) { viewHolder2 = (ViewHolder2) convertView.getTag(); } } if (type == TYPE_1) { if(position==0){ viewHolder1.textViewTitle.setText("高血压"); }else if(position==4){ viewHolder1.textViewTitle.setText("糖尿病"); } } if (type == TYPE_2) { viewHolder2.expandableTextView.setText(sampleStrings[position], mCollapsedStatus, position); viewHolder2.textViewPrice.setText("费用\n"+priceList.get(position)+"元/每年"); final ViewHolder2 finalViewHolder = viewHolder2; viewHolder2.checkBoxSignService.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { boolean isChecked = finalViewHolder.checkBoxSignService.isChecked(); isChecks.put(position,isChecked); if(isChecked){ totalPrice += priceList.get(position); checkCount++; }else{ totalPrice -= priceList.get(position); checkCount--; } tvNotice.setText("您总共选择"+checkCount+"项服务,总价共"+totalPrice+"元/年"); } }); viewHolder2.checkBoxSignService.setChecked(isChecks.get(position)); } return convertView; } @Override public int getViewTypeCount() { return 2; } @Override public int getItemViewType(int position) { if (position == 0 || position == 4) { return TYPE_1; } else { return TYPE_2; } } } }
列表项布局文件:
signservice_item1.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/paleTurquoise3" android:orientation="vertical" android:padding="5dp"> <TextView android:id="@+id/tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/black" android:textSize="16sp" android:text="测试"/> </LinearLayout>
signservice_item2.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:expandableTextView="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <CheckBox android:id="@+id/cb_signService" android:layout_width="30dp" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_margin="5dp" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="40dp" android:layout_marginRight="85dp" android:orientation="vertical"> <com.ms.square.android.expandabletextview.ExpandableTextView android:id="@+id/expand_text_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="5dp" expandableTextView:animAlphaStart="1" expandableTextView:maxCollapsedLines="4"> <TextView android:id="@id/expandable_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:fontFamily="sans-serif-light" android:textColor="#666666" android:textSize="16sp" /> <ImageButton android:id="@id/expand_collapse" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right|bottom" android:background="@android:color/transparent" android:padding="16dp" /> </com.ms.square.android.expandabletextview.ExpandableTextView> </LinearLayout> <TextView android:id="@+id/tv_price" android:layout_width="70dp" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_margin="10dp" android:gravity="center" android:fontFamily="sans-serif-light" android:textColor="#666666" android:textSize="16sp" /> </RelativeLayout>
相关文章推荐
- popwindow创建以及事件拦截与内部包含checkbox选中
- js获取下拉列表选中项的值和文本(select)以及获取单选按钮(radio)组的值和修改选中项[转]
- JS 事件列表 以及中文说明
- extJs 文本框后面加上说明文+下拉列表选中值后出发事件
- JS 页面控件的操作、以及页面在一段时间内不操作就跳转、页面事件列表
- js获取下拉列表选中项的值和文本(select)以及获取单选按钮(radio)组的值和修改选中项
- 一个WinForm记事本程序(包含主/下拉/弹出菜单/打开文件/保存文件/打印/页面设置/字体/颜色对话框/剪切版操作等等控件用法以及记事本菜单事件/按键事件的具体代码)
- JTable中,显示checkbox以及更改选中状态
- gridview中嵌套checkbox,如何在选中事件中获取当前行的索引值
- js获取下拉列表选中项的值和文本(select)以及获取单选按钮(radi...
- js获取下拉列表选中项的值和文本(select)以及获取单选按钮(radio)组的值和修改选中项
- 一个WinForm记事本程序(包含主/下拉/弹出菜单/打开文件/保存文件/打印/页面设置/字体/颜色对话框/剪切版操作等等控件用法以及记事本菜单事件/按键事件的具体代码)
- 选中数据库中的checkboxlist 列表
- js获取下拉列表选中项的值和文本(select)以及获取单选按钮(radio)组的值和修改选中项[转]
- extJs 文本框后面加上说明文字+下拉列表选中值后触发事件
- 关于TreeView控件CheckBox选中事件
- 一个WinForm记事本程序(包含主/下拉/弹出菜单/打开文件/保存文件/打印/页面设置/字体/颜色对话框/剪切版操作等等控件用法以及记事本菜单事件/按键事件的具体代码)
- js获取下拉列表选中项的值和文本(select)以及获取单选按钮(radio)组的值和修改选中项[转]
- JS获取下拉列表选中项的值和文本(select)以及获取单选按钮(radio)组的值和修改选中项
- TreeView的选中CheckBox触发事件