解决方案 »
- android中以下两种httpclient设置连接超时的方式有什么不同
- 求助,在一个activity里面设置 自动跳转到下一个activity的方法!
- 请教一个服务如何启动另外一个服务?
- 关于Android下使用正则表达式的问题
- android默认启动程序的问题
- appframework中panel的data-defer属性
- Settings源代码讨论-com.android.settings.applications.ApplicationsState中为何加锁?
- 如何从library依赖库的aar文件中去除不用的jar包
- 新人自学一星期,控件闪退问题。求大神指点
- 大佬们,现在安卓端和Web服务器端是怎样交互的?
- android textview 异步线程加载html 时候出现 图文重叠
- android开发文档翻译
但是我要删除的其实是数据库里的数据啊
那你就直接删数据库的数据啊如果点完全选后,又取消某一条记录呢?问题不在于如何一次删掉所有数据,而在于如何删除掉那些没有在屏幕中被显示过的item中的数据。
//全选按钮的监听
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进行操作(只要被显示过,就能正常被删除)。
但是我要删除的其实是数据库里的数据啊
那你就直接删数据库的数据啊如果点完全选后,又取消某一条记录呢?问题不在于如何一次删掉所有数据,而在于如何删除掉那些没有在屏幕中被显示过的item中的数据。
你点全选的然后再进行真正删除操作的时候就直接清空list,如果你要取消某一个,就把全选后取消的那一项单独添加到保留list,然后listview再加载这个保留list。
其实我不知道是不是楼主你问题没描述清楚,还是我理解有误,我觉得这个逻辑很清晰,很简单啊
点全选 - 点删除,代码里做lis1t清空操作
点全选 - 点前10条中的1条 - 点删除,代码里把10条中的那1条item保存下来放到list2中,清空list1,listview加载list2(当然这只是一种解决方法,还有各种其他的方法)
这样行吗
这个方法应该可以,但是我觉得没有通用性啊,万一用户根本不点全选,直接选了2条点删除呢,会不会很麻烦?我还是想利用checkbox,循环,如果ischecked=true就删除。
我猜我的问题是在viewholder里吧,但是我这几天有点绕晕了,看来还得仔细看看viewholder的逻辑。
非常感谢
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中清除
}
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中清除
}
您的回答我很收益。如您方便,我再问点吧。
我对MVC有一知半解,您说的大概和它类似吧?通过【应用】→【逻辑】→【显示】实现程序。但是我开始有点混乱了,上面这段 if (holder.checkbox.isChecked())应该算是“逻辑”的部分,但是要怎么把它从“显示”中分离出来呢(我的代码都是从别人的代码那里参考分析来的,所以没有例子我还真不明白呢)?您是否有相关的简单例子能给我看看呢?另外对于下面的代码,应该算是“逻辑”还是“显示”啊?
if(checkVisible)
holder.checkbox.setVisibility(View.VISIBLE);
else
holder.checkbox.setVisibility(View.GONE);
您的回答我很收益。如您方便,我再问点吧。
我对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的工作流程。
年纪大了,脑子绕不过来弯,终于弄明白了,非常感谢。getView()只管显示list里的东西;通过点击或者全选将list里的对应的行号和id值存入【待删除处理】的deleteMap中;通过删除按钮,把对应id的记录一条条删掉,刷新list(也就刷新了getView())。明白了就发现真的不复杂,:-)