我的ListView自定义适配器(及其新实现的viewHolder)存在一些问题.我有一个ListView,每个项目都有一个复选框(这里没有新内容).问题是,如果我的列表中有超过9个项目,当我检查第一个复选框时,将自动检查第十个(第二个与第十一个相同),就像两个项目都有一个监听器一样(和我相信它是某种情况下的情况).
我在这里阅读了关于listView的位置问题,查看了回收和ViewHolder解决方法:How can I make my ArrayAdapter follow the ViewHolder pattern?
但我可能做错了,因为它不起作用……
public class PresenceListAdapter extends SimpleAdapter { private LayoutInflater inflater; private List<Integer> ids; private List<String> statuts; public PresenceListAdapter (Context context,List<? extends Map<String,?>> data,int resource,String[] from,int[] to,List<Integer> ids,List<String> statuts) { super (context,data,resource,from,to); inflater = LayoutInflater.from (context); this.ids = ids; this.statuts= statuts; } @Override public Object getItem (int position) { return super.getItem (position); } @Override public View getView (int position,View convertView,ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = inflater.inflate (R.layout.list_text_checkBox,null); holder = new ViewHolder(); holder.btn = (Button) convertView.findViewById(R.id.btnRetard); holder.check = (CheckBox) convertView.findViewById(R.id.checkPresent); if (statuts.get(position).equals("P")) { Drawable img = inflater.getContext().getResources().getDrawable(android.R.drawable.presence_online); holder.btn.setCompoundDrawablesWithIntrinsicBounds( img,null,null ); holder.btn.setEnabled(true); holder.check.setChecked(true); } else if(statuts.get(position).equals("R")) { Drawable img = inflater.getContext().getResources().getDrawable(android.R.drawable.presence_away); holder.btn.setCompoundDrawablesWithIntrinsicBounds( img,null ); holder.btn.setEnabled(true); holder.check.setChecked(true); } else { Drawable img = inflater.getContext().getResources().getDrawable(android.R.drawable.presence_invisible); holder.btn.setCompoundDrawablesWithIntrinsicBounds( img,null ); holder.check.setChecked(false); } convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } int id = ids.get(position); if(id != 0) { holder.check.setTag(id); holder.btn.setTag(id); } return super.getView (position,convertView,parent); } static class ViewHolder { Button btn; CheckBox check; }
我的听众:
public void changerPresent(View v){
CheckBox checkPresent = (CheckBox) v; int idPersonne = (Integer) checkPresent.getTag(); View parent = (View)v.getParent(); Button btn = (Button) parent.findViewById(R.id.btnRetard); if(checkPresent.isChecked()) { gestion.updatePresence(idPersonne,idSeance,"P"); btn.setEnabled(true); setBtnRetardPresent(btn); } else { gestion.updatePresence(idPersonne,"A"); btn.setEnabled(false); setBtnRetardAbsent(btn); } }
在这一点上,我将不胜感激,我现在正在努力工作几个小时.
非常感谢你.
解决方法
这是我如何使它工作:
首先,您需要一个单独的数组用于检查状态.它必须与适配器的getCount()大小相同.
然后在你的getView上,你的复选框的setOnCheckedChangedListener必须打开你的checkBox.setChecked语句.
例:
holder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) { isChecked[position] = isChecked; } }); holder.checkBox.setChecked(isChecked[position]);