Android 如何在列表视图中保持CheckedTextView的状态和位置?

Android 如何在列表视图中保持CheckedTextView的状态和位置?,android,onitemclicklistener,checkedtextview,Android,Onitemclicklistener,Checkedtextview,我有一个使用自定义适配器用checkedtextview填充的listview,我遇到的问题是,当我在列表视图中选中一个复选框另一个复选框时,现在我完全理解了列表视图的概念以及视图是如何回收的,那么我在这里做错了什么? 我遇到的另一个问题是,当滚动时,复选框的位置不断变化 我已经尝试了多种解决方案,并继续尝试,任何有助于理解这个问题的帮助都是非常感谢的 这是checkedtextview xml 这是McClickListener的代码 mServiceListView.setOnItemCli

我有一个使用自定义适配器用checkedtextview填充的listview,我遇到的问题是,当我在列表视图中选中一个复选框另一个复选框时,现在我完全理解了列表视图的概念以及视图是如何回收的,那么我在这里做错了什么? 我遇到的另一个问题是,当滚动时,复选框的位置不断变化 我已经尝试了多种解决方案,并继续尝试,任何有助于理解这个问题的帮助都是非常感谢的

这是checkedtextview xml

这是McClickListener的代码

mServiceListView.setOnItemClickListener新建AdapterView.OnItemClickListener{ @凌驾 public void-mclickAdapterView父级、视图视图、整型位置、长id{ //在相对视图中查找checkedTextView ctv=CheckedTextView.findViewById R.id.CheckedTextView; mServiceQuantity=TextView view.findviewbyd R.id.quantity\u tv; mMinusBtn=按钮视图.findviewbyd R.id.减号\u btn; mPlusBtn=按钮视图.findviewbyd R.id.plus\u btn; 选中TextView ctv.toggle; 服务服务=服务父项。getItemAtPositionposition; 如果检查ctv{ selectedServices.addservice.getServiceNum; //使“数量”选项可见 mMinusBtn.setVisibility View.VISIBLE; mPlusBtn.setVisibility View.VISIBLE; mServiceQuantity.setVisibility View.VISIBLE; }否则{ //从表中删除服务和数量 selectedServices.remove service.getServiceNum; 选择edserviceshash.remove service.getServiceNum; //“数量”选项将不可见 mMinusBtn.setVisibility View.INVISIBLE; mPlusBtn.setVisibility View.INVISIBLE; mServiceQuantity.setVisibility View.INVISIBLE; } } } ; 这是定制适配器的代码

包com.example.android.bookkeepingapp; 导入android.content.Context; 导入android.support.annotation.NonNull; 导入android.support.annotation.Nullable; 导入android.support.v7.widget.RecyclerView; 导入android.util.Log; 导入android.view.LayoutInflater; 导入android.view.view; 导入android.view.ViewGroup; 导入android.widget.AdapterView; 导入android.widget.ArrayAdapter; 导入android.widget.Button; 导入android.widget.CheckBox; 导入android.widget.CheckedTextView; 导入android.widget.ListView; 导入android.widget.TextView; 导入android.widget.Toast; 导入org.w3c.dom.Text; 导入java.util.ArrayList; 导入java.util.Hashtable; 导入java.util.List; 导入java.util.Set; 公共类ServiceAdapterCheckBox扩展了ArrayAdapter{ 私有哈希表selectedServicesHash; 专用设置服务; 平民的ServiceAdapterCheckBox@NonNull上下文,int资源,列表对象 ,哈希表selectedServiceHash{ 超上下文、资源、对象; this.selectedServicesHash=selectedServicesHash; } public void setselectedservices哈希表selectedServices{ this.selectedServicesHash=selectedServices; } @非空 @凌驾 公共视图getViewint位置,@Nullable View convertView,@NonNull ViewGroup父级{ //查找当前对象 服务=getItemposition; //将哈希表的所有服务名称放入列表中 serviceNums=selectedServicesHash.keySet; 最终持票人; 如果convertView==null{ 支架=新的视图支架; convertView=LayoutFlater.fromgetContext.inflateR.layout.service\u项目\u复选框, 父母,假; holder.textCheckBox=CheckedTextView convertView.findViewByIdR.id.CheckedTextView; holder.minBtn=按钮convertView.findViewById R.id.减\u btn; holder.plusBtn=按钮convertView.findViewById R.id.plus\u btn; holder.quantityTv=TextView convertView.findViewById R.id.quantity\u tv; convertView.setTagholder; } 否则{ //getTag将viewHolder对象集作为标记返回给视图 holder=ViewHolderconvertView.getTag; } //为TextView提供正确的数据 断言服务!=null; holder.textCheckBox.setText service.getServiceName; //设置用户设置的数量值 holder.plusBtn.setOnClickListener新视图.OnClickListener{ @凌驾 公共void onclick视图{ //holder.plusBtn.setFocusabl e正确; int quantityValue=Integer.parseIntholder.quantityTv.getText.toString; quantityValue++; holder.quantityTv.setText String.valueOf quantityValue; } } ; holder.minBtn.setOnClickListener新建视图.OnClickListener{ @凌驾 公共void onclick视图{ //holder.plusBtn.setFocusable true; int quantityValue=Integer.parseIntholder.quantityTv.getText.toString; ifquantityValue==1{ quantityValue=1; } 否则{ 数量值-; } holder.quantityTv.setText String.valueOf quantityValue; } } ; //如果哈希表中存在服务,则 ifserviceNums.size!=0 { Log.vthis.getContext.toString,已选择服务; //将哈希表的所有服务名称放入列表中 对于字符串s:serviceNums{ 如果service.getServiceNum.s等于s{ //将当前位置的检查文本设置为true //holder.textCheckBox.setChecked true; //将“数量”文本框设置为用户设置的正确值 //holder.quantityTv.setTextselectedServicesHash.get; //将数量选择器设置为可见 holder.plusBtn.setVisibility View.VISIBLE; holder.minBtn.setVisibility View.VISIBLE; holder.quantityTv.setVisibility View.VISIBLE; } } } 否则{ Log.vthis.getContext.toString,否列表为空; //将“数量”文本框设置为用户设置的正确值 holder.quantityTv.setText1; } 返回视图; } 公共哈希表GetSelectedServicesAsh{ 返回selectedServicesHash; } /** *定制吐司 * *@param消息 */ 专用无效Toastmessagesting消息{ Toast.makeText获取上下文、消息、Toast.LENGTH\u SHORT.show; } 私有类视窗持有者{ 受保护的CheckedTextView文本复选框; 保护按钮plusBtn; 保护按钮minBtn; 受保护的文本视图quantityTv; } } 我只想得到正确的复选框和正确的位置
谢谢…

因为视图是在ListView中循环使用的,所以您必须将视图状态更新为适配器代码中应有的状态。否则,视图将只具有正在重用的旧视图的选中状态

因此,除了更新视图上的文本外,还需要设置其选中状态

//supply the textViews with the correct data
assert service != null;
holder.textCheckBox.setText( service.getServiceName() );

// ALSO UPDATE THE CHECKED STATE - FROM YOUR POSTED CODE, I ASSUME IT SHOULD BE
// CHECKED IF IT APPEARS IN THE "selectedServices" list
holder.textCheckBox.setChecked(selectedServices.contains(service));