【问题标题】:Checkbox not working properly with ListView复选框无法与 ListView 一起正常工作
【发布时间】:2012-08-23 06:07:41
【问题描述】:

我正在为 listview 的每个 Iten 实现带有 listview 的复选框。我遇到的问题是,当我单击任何单个复选框时,其他一些未单击的复选框也被随机单击。

public View getView(int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub

            View vi = convertView;
            final int as=position;
            if (convertView == null) { // if it's not recycled, initialize some
                // attributes
                LayoutInflater  inflater = (LayoutInflater) activity
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                vi = inflater.inflate(R.layout.grid_item, null);
                holder = new ViewHolder();

                holder.textheader = (TextView) vi.findViewById(R.id.item1);
                holder.textcpu = (TextView) vi.findViewById(R.id.item2);
                holder.text_modified_date = (TextView) vi.findViewById(R.id.item4);
                holder.text_cpu = (TextView) vi.findViewById(R.id.item3);
                holder.text_checkbox=(CheckBox)vi.findViewById(R.id.checkBox1);
                vi.setTag(holder);

                holder.text_checkbox.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if (holder.text_checkbox.isClickable()) {
                            itemChecked.set(as, true);
                            packages=as;
                        } else if (!holder.text_checkbox.isClickable()) {
                            itemChecked.set(as, false);
                        }
                        String packag=app_package.get(as);
                        Log.d("package listttttttttt", packag);
                    }
                });


            } else {
                holder = (ViewHolder) vi.getTag();


            }

【问题讨论】:

    标签: android listview checkbox


    【解决方案1】:

    试试下面的代码

    public View getView(int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub
    
            View vi = convertView;
            final int as=position;
            if (convertView == null) { // if it's not recycled, initialize some
                // attributes
                LayoutInflater  inflater = (LayoutInflater) activity
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                vi = inflater.inflate(R.layout.grid_item, null);
                holder = new ViewHolder();
    
                holder.textheader = (TextView) vi.findViewById(R.id.item1);
                holder.textcpu = (TextView) vi.findViewById(R.id.item2);
                holder.text_modified_date = (TextView) vi.findViewById(R.id.item4);
                holder.text_cpu = (TextView) vi.findViewById(R.id.item3);
                holder.text_checkbox=(CheckBox)vi.findViewById(R.id.checkBox1);
                vi.setTag(holder);
    
            } else {
                holder = (ViewHolder) vi.getTag();
            }          
    
    
                 holder.text_checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() 
                 {          
                  public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)      
                    {                                  
                    if(isChecked)
                    {
                          // do your stuff
                          itemChecked.set(as, true);
                            packages=as;
                    }
                    else
                    {
                          // do your stuff
                          itemChecked.set(as, false);
                    }       
    
            }
        });
    
    if(itemChecked.size() != 0 && itemChecked.get(position))
            holder.text_checkbox.setChecked(true);
        else
            holder.text_checkbox.setChecked(false);
    

    【讨论】:

    • 我现在做了一点零钱检查...顺便说一下 itemChecked.set(as, true);有吗?
    • 无法设置 setOnCheckedChangeListener 方法。 itenChecked.set 如果项目被选中,则设置标志为真,并且位置也是如此
    • setOnCheckedChangeListener 是 checkBox 的标准方法回调。你应该能够使用它。它有什么问题,我的意思是,它有什么错误吗?
    • 现在我可以设置方法 setOnCheckedChangeListener,但仍然面临同样的问题
    • 我已经编辑了我的答案...现在检查。我使用了 itemChecked。如果不正确,请自行更改
    【解决方案2】:

    问题是您不能让可聚焦项目与列表视图一起使用,但有一种方法可以解决这个问题:

    如果您使用 XML 布局作为列表项,请将复选框可聚焦属性设置为 false:

    android:focusable="false"
    

    这应该会导致列表项也可以点击。

    我希望这能解决您的问题。请告诉我进展如何。

    【讨论】:

      【解决方案3】:

      问题是您的getView() 方法不能正确处理视图。您必须设置新视图的状态并更新回收视图的状态。此外,您必须定义视图的行为。 SO上有很多类似问题的线程。我认为this one 可以帮助您(它包含工作代码)。

      您的代码应类似于以下框架:

      public View getView(int position, View convertView, ViewGroup parent) {
          View vi = convertView;
          final int as=position;
          if (convertView == null) { // no view passed, create one
              LayoutInflater  inflater = (LayoutInflater) activity
                      .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
              vi = inflater.inflate(R.layout.grid_item, null);
              // Setup the View content
              holder = new ViewHolder();
              holder.textheader = (TextView) vi.findViewById(R.id.item1);
              holder.textcpu = (TextView) vi.findViewById(R.id.item2);
              holder.text_modified_date = (TextView) vi.findViewById(R.id.item4);
              holder.text_cpu = (TextView) vi.findViewById(R.id.item3);
              holder.text_checkbox=(CheckBox)vi.findViewById(R.id.checkBox1);
              // Do your checkbox initial setup here. 
              holder.text_checkbox.setChecked(getBooleanFromPosition(position));
              vi.setTag(holder);
              // Setup the View behavior
               holder.text_checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() 
               {          
                    // Do your stuff here
          });
          } else {
              // Update your View state
              holder = (ViewHolder) vi.getTag();
              holder.text_checkbox.setChecked(getBooleanFromPosition(position));
          }                   
      

      显然,您必须将复选框的状态存储在某些数据结构中,例如布尔数组并读取该数据结构,以便了解给定位置的复选框是否已选中/未选中(读取访问权限是getBooleanFromPosition 应该这样做)。并且应该在控制View 行为的部分中更新该数据结构。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-07
        • 2021-09-04
        • 1970-01-01
        • 1970-01-01
        • 2017-04-04
        相关资源
        最近更新 更多