解决方案 »

  1.   

    当你要进行全选操作时,表面上是选择当前显示到的,其实代码里可以直接删除那个list
      

  2.   

    楼上正解,然后通过adapter.notifyDataSetChanged();更新ListView的显示
      

  3.   

    如果listview里显示的数据是从list集合里拿的话,你删除listview中所选项在list对应位置上的数据即可,然后调用适配器的更新方法
      

  4.   


    但是我要删除的其实是数据库里的数据啊
       那你就直接删数据库的数据啊如果点完全选后,又取消某一条记录呢?问题不在于如何一次删掉所有数据,而在于如何删除掉那些没有在屏幕中被显示过的item中的数据。
      

  5.   


     //全选按钮的监听
        class SelectAllButtonClick implements OnClickListener{
         @Override 
         public void onClick(View v){    
         for(int i=0;i<annList.size();i++){
         adapter.getIsSelected().put(i, true);
         }
                adapter.notifyDataSetChanged(); 
         }
        }--------------------------------------------
    getIsSelected()的相关代码:
    private static HashMap<Integer,Boolean> isSelected;
    ……
    public HashMap<Integer,Boolean> getIsSelected() { 
            return isSelected; 
        }
    ……
    -------------------------------getview:---------------------------
    public View getView(int position, View convertView, ViewGroup parent) {  
            ViewHolder holder;  
            if(convertView == null){  
                holder = new ViewHolder();  
                convertView = layoutInflater.inflate(R.layout.special_date_list, null);  
                holder.id = (TextView)convertView.findViewById(R.id.id);  
                holder.name = (TextView)convertView.findViewById(R.id.sdName);  
                holder.ann_date = (TextView)convertView.findViewById(R.id.sdTime); 
                holder.checkbox = (CheckBox)convertView.findViewById(R.id.check4Select); -
                convertView.setTag(holder);          }else{  
             holder = (ViewHolder) convertView.getTag();  
            }  
            holder.id.setText((String)list.get(position).get("id"));
            holder.name.setText((String)list.get(position).get("name"));
            holder.ann_date.setText((String)list.get(position).get("date"));
            holder.checkbox.setChecked(getIsSelected().get(position)); 
            if (holder.checkbox.isChecked() == true) {   
             deleteMap.put(position, (String)holder.id.getText()); 
            } else {   
             deleteMap.remove(position);//把之前选中之后又取消的从hashmap中清除 
            }
            return convertView;  
        } 
     ----------------------------  ViewHolder----------------------- 
        public static class ViewHolder {  
         public TextView id; 
         public TextView name;  
            public TextView ann_date; 
            public CheckBox checkbox;
        }
    1.全选能够选中那些未被显示区域的item
    2.问题是我的代码不能对那些【被选中但是从未被显示过的】item进行操作(只要被显示过,就能正常被删除)。
      

  6.   


    但是我要删除的其实是数据库里的数据啊
       那你就直接删数据库的数据啊如果点完全选后,又取消某一条记录呢?问题不在于如何一次删掉所有数据,而在于如何删除掉那些没有在屏幕中被显示过的item中的数据。
    你点全选的然后再进行真正删除操作的时候就直接清空list,如果你要取消某一个,就把全选后取消的那一项单独添加到保留list,然后listview再加载这个保留list。
    其实我不知道是不是楼主你问题没描述清楚,还是我理解有误,我觉得这个逻辑很清晰,很简单啊
      

  7.   

    listview加载list1,list1里有18条数据
    点全选 - 点删除,代码里做lis1t清空操作
    点全选 - 点前10条中的1条 - 点删除,代码里把10条中的那1条item保存下来放到list2中,清空list1,listview加载list2(当然这只是一种解决方法,还有各种其他的方法)
    这样行吗
      

  8.   


    这个方法应该可以,但是我觉得没有通用性啊,万一用户根本不点全选,直接选了2条点删除呢,会不会很麻烦?我还是想利用checkbox,循环,如果ischecked=true就删除。
    我猜我的问题是在viewholder里吧,但是我这几天有点绕晕了,看来还得仔细看看viewholder的逻辑。
    非常感谢
      

  9.   

    这个思路其实挺简单的,ListView只是负责显示而已,adapter里保存实际的数据
    1. 点了全选,把adapter里的数据全标记为选中,刷新ListView让当前显示的View全选中。
    2. 滑动或者拖动,对单个点击,就对应的把adapter里的数据标记选中或者非选中,刷新对应的View。
    3. 点删除则删除adapter里的数据,并且刷新ListView。关键就一句话:不要依赖ListView控件的子View 去检查是否有标记。你的问题关键在于getView时做了不应该做的事情。
    getView 推荐只设置显示UI的事情,而不处理数据,否则影响UI显示效率。//这部分应该在点击删除时处理。
     if (holder.checkbox.isChecked() == true) {   
             deleteMap.put(position, (String)holder.id.getText()); 
            } else {   
             deleteMap.remove(position);//把之前选中之后又取消的从hashmap中清除 
            }
      

  10.   

    楼上说到点了,最主要的是lz你需要关心的是adapter对应的实际list数据,而不是关心显示
      

  11.   

    是不是你全選之前,對應的item還沒有創建,滑動後才創建的。
      

  12.   


    public View getView(int position, View convertView, ViewGroup parent) { 这里的position只是显示的纪录的索引,所以你下面的deleteMap中没有放入未显示的纪录的索引。 if (holder.checkbox.isChecked() == true) {   
             deleteMap.put(position, (String)holder.id.getText()); 
            } else {   
             deleteMap.remove(position);//把之前选中之后又取消的从hashmap中清除 
            }
      

  13.   


    您的回答我很收益。如您方便,我再问点吧。
    我对MVC有一知半解,您说的大概和它类似吧?通过【应用】→【逻辑】→【显示】实现程序。但是我开始有点混乱了,上面这段 if (holder.checkbox.isChecked())应该算是“逻辑”的部分,但是要怎么把它从“显示”中分离出来呢(我的代码都是从别人的代码那里参考分析来的,所以没有例子我还真不明白呢)?您是否有相关的简单例子能给我看看呢?另外对于下面的代码,应该算是“逻辑”还是“显示”啊?
    if(checkVisible)
                holder.checkbox.setVisibility(View.VISIBLE);
            else 
               holder.checkbox.setVisibility(View.GONE);
      

  14.   


    您的回答我很收益。如您方便,我再问点吧。
    我对MVC有一知半解,您说的大概和它类似吧?通过【应用】→【逻辑】→【显示】实现程序。但是我开始有点混乱了,上面这段 if (holder.checkbox.isChecked())应该算是“逻辑”的部分,但是要怎么把它从“显示”中分离出来呢(我的代码都是从别人的代码那里参考分析来的,所以没有例子我还真不明白呢)?您是否有相关的简单例子能给我看看呢?另外对于下面的代码,应该算是“逻辑”还是“显示”啊?
    if(checkVisible)
                holder.checkbox.setVisibility(View.VISIBLE);
            else 
               holder.checkbox.setVisibility(View.GONE);上面这段 if (holder.checkbox.isChecked())应该算是“逻辑”的部分,但是要怎么把它从“显示”中分离出来呢
    A: 根本不必要检查checkBox 的状态,checkBox也是个View,只是显示用的,不要去检查它的check状态。check状态建议保存在Adapter内,而不是依赖控件是否checked。您是否有相关的简单例子能给我看看呢?
    A:androidSDK自带sample有很多例子,如果有一定能力了也可以去读读android的源码。另外对于下面的代码,应该算是“逻辑”还是“显示”啊?
    if(checkVisible)
                holder.checkbox.setVisibility(View.VISIBLE);
            else 
               holder.checkbox.setVisibility(View.GONE);A: 这部分适合在getView处理,只是checkVisible要改成check实际保存状态。个人建议而已,大家共同学习,共同进步。对于不理解的建议先看看ListView的工作流程。
      

  15.   


    年纪大了,脑子绕不过来弯,终于弄明白了,非常感谢。getView()只管显示list里的东西;通过点击或者全选将list里的对应的行号和id值存入【待删除处理】的deleteMap中;通过删除按钮,把对应id的记录一条条删掉,刷新list(也就刷新了getView())。明白了就发现真的不复杂,:-)