自定义ListView不返回所有选中的项目

时间:2015-03-14 19:04:43

标签: android

我想创建一个按钮,单击该按钮时,将检查自定义ListView中的所有项目。 ListView包含3个TextView和1个CkeckBox。适配器如下:

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,不管怎么说都没有将所有项目添加到列表而不滚动?非常感谢

1 个答案:

答案 0 :(得分:0)

如果你想要一个按钮检查ListView中的所有项目,这里是食谱:

为您的inFileChooser课程添加一个带有getter和setter的布尔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术语中,这是 View 模型

获取其初始值的位置

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

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

o.setInFileChooser(isChecked);

在MVC术语中, Controller (OnCheckedChangedListener)将视图中的更改传输到模型

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();
    }
});