当前位置: 首页 > 面试题库 >

ListView Viewholder复选框状态

梁丘扬
2023-03-14
问题内容

我的ListView自定义适配器(及其新实现的viewHolder)存在一些问题。我有一个ListView,每个项目都有一个复选框(这里没有新内容)。问题是,如果列表中有9个以上的项目,则当我选中第一个复选框时,将自动检查第10个复选框(第二个和第11个复选框相同),就像两个项目都有一个监听器一样(我相信情况确实如此)。

我在这里阅读了有关listView的位置问题,视图回收以及ViewHolder解决问题的html" target="_blank">方法:如何使ArrayAdapter遵循ViewHolder模式?

但是我可能做错了什么,因为它不起作用…

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, 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, null, 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, null, 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, idSeance, "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]);


 类似资料:
  • 当html页面上没有任何变量可以切换时,是否有人知道如何使用selenium处理或读出复选框的状态(true/false)。我已经尝试了常用函数。isselected()和。isenabled(),但这些函数只读取不可用的值。 有人知道有没有办法得到这个身份吗?此外,xml的屏幕截图以及它是哪个元素。 如果有人有主意就太好了。我在用Java编程。

  • 如果我打开活动,复选框始终保持选中状态,即使我取消选中它并离开活动或关闭应用程序,在重新启动活动后,它也将保持选中状态。 我已尝试使用以下代码段保存活动的状态。 复选框应始终处于用户离开它的状态(选中或未选中)。

  • 问题内容: 通过某种方式,通过Angular的魔力,如果您使用并提供一个布尔值,则如果布尔值是true,则您的复选框将被选中,如果布尔值是true,则未选中。 尽管仅此一项就让人感到莫名其妙,但我实际上是在尝试反转选中状态,因为与todo示例不同,后者意味着选中了复选框,而我的模型更像。 不幸的是,我的第一个猜测没有用: 我所处的位置已经决定了模型,因此我无法更改它,也不必在客户端上对其进行按摩(

  • 问题内容: 我有一个列表视图,大约有200个项目,我为复选框实现了一个自定义ArrayAdapter。我使用SparseBooleanArray来存储盒子的值。 所有这些工作正常,但我似乎无法以图形方式更新复选框的检查。如果用户单击,则选中该框。但是,如果我在代码中调用setChecked,则它对框本身没有影响(因此,即使其值为true,也不会对其进行打勾)。 我通过尝试将所有框都设置为true并

  • 问题内容: 我希望一个事件在选中/未选中复选框时触发客户端: 基本上,我希望页面上的每个复选框都发生这种情况。这种触发点击并检查状态的方法可以吗? 我认为必须有一种更清洁的jQuery方式。有人知道解决方案吗? 问题答案: 绑定到事件而不是。但是,您可能仍然需要检查是否已选中该复选框: 绑定到 事件 而不是事件的主要好处是,并非所有对复选框的单击都会导致其更改状态。如果只想捕获导致复选框更改状态的

  • 我们使用的是Vaadin 8,我们有一个多选网格。在标题中有一个复选框,用作全选/取消全选复选框。问题是,窗口关闭后,标题复选框不会保持选中状态。E、 g.如果窗口打开,则选中标题复选框-