加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – ListView Viewholder复选框状态

发布时间:2020-12-14 16:19:02 所属栏目:Java 来源:网络整理
导读:我的ListView自定义适配器(及其新实现的viewHolder)存在一些问题.我有一个ListView,每个项目都有一个复选框(这里没有新内容).问题是,如果我的列表中有超过9个项目,当我检查第一个复选框时,将自动检查第十个(第二个与第十一个相同),就像两个项目都有一个监听
我的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]);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读