当前位置: 首页 > 知识库问答 >
问题:

列表视图视图复选框状态

拓拔麒
2023-03-14

我的ListView自定义适配器(及其新实现的viewHolder)有一些问题。我有一个列表视图,每个项目都有一个复选框(这里没有新内容)。问题是,如果我的列表中有超过9个项目,当我选中第一个复选框时,第十个将自动选中(第二个与第十一个相同),就像两个项目都有一个监听器一样(我认为在某种程度上是这样)。

我在这里读到了listView、视图回收和ViewHolder解决它的方法的位置问题:如何使我的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 changer present(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);

    }

}

在这一点上,我将感谢任何帮助,我现在已经为此工作了几个小时。

非常感谢。

共有3个答案

贝财
2023-03-14

这个问题是因为listview回收它的视图

因此,在getView()方法中

     if (convertView == null)
        {
    ........
         }
    else 
        {
            holder = (ViewHolder) convertView.getTag();


        }
  // Uncheck needed boxes here... You need to implement your logic 
        if( 'position' is checked earlier)
         holder.check.setChecked(true);
        else
        holder.check.setChecked(false);

如果转换不为空,您需要编写代码来管理视图的状态,因为它是一个已经使用的视图,可能已经选中了复选框。

楚博雅
2023-03-14

您应该在ViewHolder初始化之外设置CheckedBox状态,如下代码所示:

if (convertView == null) {
    viewHolder = new ViewHolder();
    convertView.setTag(viewHolder);
} else {
    viewHolder = (ViewHolder) convertView.getTag();
}

viewHolder.checkedBox.setChecked();

BTW:使用SparseBooleanArray而不是两个列表来存储CheckedBox状态。

锺离飞鸣
2023-03-14

下面是我如何让它工作的:

首先,您需要一个单独的数组来检查状态。它必须与适配器的getCount()大小相同。

然后在getView上,checkbox的setOnCheckedChangedListener必须在checkbox.setChecked语句之前。

例子:

holder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
  @Override
  public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    isChecked[position] = isChecked;
  }
});

holder.checkBox.setChecked(isChecked[position]);
 类似资料:
  • 我知道有许多解决方案可以解决这个问题,但我并不是解决这个问题的正确方法,当一个复选框被选中时,我会为它分配一个ID,并将其添加到一个数组中,但当向下滚动时,该复选框被取消选中,但ID存储在数组中,如果它被选中,我希望它保持选中状态。 我的适配器类是。

  • ListView控件用于显示项列表。 与TreeView控件一起,它允许您创建类似Windows资源管理器的界面。 让我们从工具箱中单击ListView控件并将其放在表单上。 ListView控件显示项目列表以及图标。 ListView控件的Item属性允许您添加和删除项目。 SelectedItem属性包含所选项的集合。 MultiSelect属性允许您在列表视图中设置选择多个项目。 Check

  • 我已经设法让我的应用程序在复选框状态更改时更新数据库,但当我滚动应用程序时,复选框的状态会更改。 我的问题是:如何保存复选框的状态,以便在滚动视图时它们不会更改? 这是我的光标适配器。

  • 问题内容: 我试图以与从中选择类似的方式选择的列名称。 我似乎找不到解决办法。有没有其他人以前做过此事,或者知道是否有可能? 问题答案: information_schema.columns.Table_name(至少在Sql Server 2000下)包含视图,因此只需使用

  • 我有一个列表视图,当我的活动开始时,我想要第一个项目将有背景,其他项目没有任何背景。之后,如果用户选择任何其他项目,则该特定项目的背景现在将为蓝色,其余部分将没有任何背景。请帮帮我。 My layout_effect.xml 设置默认背景的GetView代码 listview的任何我的onclickListner 我的列表视图xml 请帮帮我,我怎么才能解决这个问题,我从昨天开始就被困在里面了。

  • 我有一个TableView,当我向下滚动表格时,复选框被取消选中。包含复选框的表格列是列,定义为: