【问题标题】:Custom ListView not returning all checked items自定义 ListView 不返回所有选中的项目
【发布时间】:2015-03-15 23:20:51
【问题描述】:

我想制作一个按钮,当单击该按钮时,自定义 ListView 中的所有项目都会被检查。 ListView 由 3 个 TextView 和 1 个 CckeckBox 组成。适配器如下:

public View getView(final int position, View convertView, ViewGroup parent) {
           View v = convertView;
           if (v == null) {
               LayoutInflater vi = (LayoutInflater)c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
               v = vi.inflate(id, null);
           }

           final Item o = items.get(position);
           if (o != null) {
                   TextView t1 = (TextView) v.findViewById(R.id.TextView01);
                   TextView t2 = (TextView) v.findViewById(R.id.TextView02);
                   TextView t3 = (TextView) v.findViewById(R.id.TextViewDate);
                   final CheckBox checkBox1 = (CheckBox) v.findViewById(R.id.checkBox1);
                   checkBox1.setTag(o.getPath());
                   checkBox1.setOnCheckedChangeListener(new OnCheckedChangeListener() {
                    @Override
                    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                         int getPosition = (Integer) buttonView.getTag();  // Here we get the position that we have set for the checkbox using setTag.
                         items.get(getPosition).setSelected(buttonView.isChecked()); // Set the value of checkbox to maintain its state.
                        // TODO Auto-generated method stub
                      CheckBox cb = (CheckBox) buttonView ;
                      if(cb.isChecked()){
                          if(!FileChooser1.clickedItems.contains(o.getPath())){
                              FileChooser1.clickedItems.add(o.getPath());
                          }
                      }else{                              
                          FileChooser1.clickedItems.remove(o.getPath());

                      }

                    }
                });
                   checkBox1.setTag(position);

                    ImageView imageCity = (ImageView) v.findViewById(R.id.fd_Icon1);
                    String uri = "drawable/" + o.getImage();
                    int imageResource = c.getResources().getIdentifier(uri, null, c.getPackageName());
                    Drawable image = c.getResources().getDrawable(imageResource);
                    imageCity.setImageDrawable(image);

                   if(t1!=null)
                    t1.setText(o.getName());
                   if(t2!=null)
                        t2.setText(o.getData());
                   if(t3!=null)
                        t3.setText(o.getDate());
                   if(o.getImage().equals("directory_up")){
                       checkBox1.setVisibility(View.GONE); 
                   }else{
                       checkBox1.setVisibility(View.VISIBLE);
                   }
                   if(someBoolean == true)
                   {
                   checkBox1.setChecked(true);// here i set the checkbox to true for all items  
                   }


           }
           return v;               
   }     
}    

FileChooser1.clickedItems 是一个 ArrayList,其中包含所有单击的项目,问题是只有在屏幕上看到的项目才会添加到 ArrayList,例如,当我滚动到手机屏幕底部时,只有那些项目将在屏幕上看到的内容添加到列表中。例如我有 20 个项目,起初当我打开活动时,它只向 ArrayList 添加 8 个第一个项目,如果我进一步向下滚动,那么出现在底部的那些项目将被添加到 arraylist,无论如何都没有添加无需滚动即可将所有项目添加到列表中?非常感谢

【问题讨论】:

  • 您的items 对象必须是静态的
  • 谢谢,但它也不适用于静态

标签: android


【解决方案1】:

如果您想要一个按钮来检查 ListView 中的所有项目,请参考以下方法:

将带有 getter 和 setter 的布尔值 inFileChooser 添加到您的 Item 类中:

private boolean mInFileChooser;

public boolean isInFileChooser() {
    return mIsInFileChooser;
}

public void setInFileChooser(boolean inFileChooser) {
    mInFileChooser = inFileChooser;
    if (inFileChooser) {
        FileChooser1.clickedItems.add(getPath());
    } else {                              
        FileChooser1.clickedItems.remove(getPath());
    }
}

当您在适配器中创建视图时,您会调用:

checkbox1.setChecked(o.isInFileChooser());

在 MVC 术语中,这是您的 ViewModel

获取其初始值的地方

在设置 OnCheckedChangedListener 之前执行此操作,这样就不会触发它。

然后设置您的 OnCheckedChangedListener。在您的 OnCheckedChangedListener.onCheckChanged 中,您调用:

o.setInFileChooser(isChecked);

在 MVC 术语中,这是 Controller (OnCheckedChangedListener) 将 View 中的更改传输到 Model 的地方。

Button 将获得一个 OnClickListener,它将遍历 ListView 适配器中的所有项目,在它们上设置isInFileChooser(true),并告诉适配器模型已更改,是时候更新 ListView 了。

例如,在您的适配器列表中有一个方法:

public void selectAllItems() {

    for (Item item : items) {
        item.setInFileChooser(true);
    }
    notifyDataSetChanged();
}

然后:

button.setOnClickListener(new OnClickListener() {

    public void onClick(View v) {
        // acccess the adapter here
        adapter.selectAllItems();
    }
});

【讨论】:

  • 谢谢,我知道随着滚动项目被添加到 ArrayList,我只想将所有项目添加到 arraylist 而不仅仅是那些在屏幕上看到的项目
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-02
相关资源
最近更新 更多