模仿QQListView左滑删除置顶Item
2016-03-03 00:00
302 查看
摘要: 模仿QQListView左滑删除置顶Item
解决方法很简单,就是在更新Listview的时候,不要使用setAdapter,如果这样位置就会置顶了;需要更新ListView的时候,使用Adapter对象的notifyDataSetChanged方法吧。
使用notifyDataSetChanged方法的时候注意了,更新列表是所有列表项都会被更新,这里存在一个性能上 的问题,所以如果你需要改变的只是单一个列表项,建议不要使用notifyDataSetChanged方法,转而使用获得该列表项后,然后对里面的控件 进行调整吧。
有些时候调用notifyDataSetChanged方法后,getView并没有自行调用,这时候的解决办法是调用listview的requestLayout方法即可。
/**
* 置顶
*
* @param position
*/
private void setTop(int position) {
list.get(position).setSetTop("取消置顶");
list.add(0, list.get(position));
// 置顶后list.size增加一 所以要position+1
list.remove(position + 1);
adapter.notifyDataSetChanged();
}
/**
* 取消置顶
*
* @param position
*/
private void unSetTop(int position) {
boolean isAdd = false;
/** 差值 */
int min = 9999999;
/** 当前position的数值 */
int num;
// 差值最小处的行数
int j = 0;
int num2 = 0;
int jumpNum = 0;
list.get(position).setSetTop("置顶");
num = Integer.parseInt(list.get(position).getNum());
// list长度为2特殊处理
if (list.size() == 2) {
// 第一行确定为取消置顶
if (list.get(1).getSetTop().equals("取消置顶")) {
if (position == 0) {
if (num == 0) {
list.add(2, list.get(position));
}
if (num == 1) {
list.add(2, list.get(position));
}
list.remove(position);
adapter.notifyDataSetChanged();
} else {
list.add(2, list.get(position));
list.remove(position);
adapter.notifyDataSetChanged();
}
} else {
if (num == 0) {
list.add(1, list.get(position));
}
if (num == 1) {
list.add(2, list.get(position));
}
list.remove(position);
adapter.notifyDataSetChanged();
}
} else {
for (int i = 0; i < list.size(); i++) {
if (num > Integer.parseInt(list.get(i).getNum()) && num < Integer.parseInt(list.get(i + 1).getNum())) {
list.add(i + 1, list.get(position));
isAdd = true;
break;
}
}
// 如果没有比自己小的值 例如0 则isAdd=false
// 遍历list 寻找差值最小的地方插入list
if (!isAdd) {
for (int i = 0; i < list.size(); i++) {
if (i == position || list.get(i).getSetTop().equals("取消置顶")) {
// 排除与自身相比较
// 排除置顶item比较
Log.i("TAG", "调过" + i);
jumpNum++;
if (jumpNum == list.size()) {
j = list.size();
}
continue;
}
num2 = Integer.parseInt(list.get(i).getNum());
if (num2 - num < min) {
min = num2 - num;
// 记录行号
j = i;
Log.i("TAG", "插入行数J=" + j);
}
}
// 遍历完成后拿到差值min
int number = min + num;
list.add(j, list.get(position));
Log.i("TAG", "*********插入行数J=" + j);
}
list.remove(position);
adapter.notifyDataSetChanged();
}
}
这有一个大神写的demo供大家下载http://download.csdn.net/detail/qq_17250009/9228877,大家可以看看。
解决方法很简单,就是在更新Listview的时候,不要使用setAdapter,如果这样位置就会置顶了;需要更新ListView的时候,使用Adapter对象的notifyDataSetChanged方法吧。
使用notifyDataSetChanged方法的时候注意了,更新列表是所有列表项都会被更新,这里存在一个性能上 的问题,所以如果你需要改变的只是单一个列表项,建议不要使用notifyDataSetChanged方法,转而使用获得该列表项后,然后对里面的控件 进行调整吧。
有些时候调用notifyDataSetChanged方法后,getView并没有自行调用,这时候的解决办法是调用listview的requestLayout方法即可。
/**
* 置顶
*
* @param position
*/
private void setTop(int position) {
list.get(position).setSetTop("取消置顶");
list.add(0, list.get(position));
// 置顶后list.size增加一 所以要position+1
list.remove(position + 1);
adapter.notifyDataSetChanged();
}
/**
* 取消置顶
*
* @param position
*/
private void unSetTop(int position) {
boolean isAdd = false;
/** 差值 */
int min = 9999999;
/** 当前position的数值 */
int num;
// 差值最小处的行数
int j = 0;
int num2 = 0;
int jumpNum = 0;
list.get(position).setSetTop("置顶");
num = Integer.parseInt(list.get(position).getNum());
// list长度为2特殊处理
if (list.size() == 2) {
// 第一行确定为取消置顶
if (list.get(1).getSetTop().equals("取消置顶")) {
if (position == 0) {
if (num == 0) {
list.add(2, list.get(position));
}
if (num == 1) {
list.add(2, list.get(position));
}
list.remove(position);
adapter.notifyDataSetChanged();
} else {
list.add(2, list.get(position));
list.remove(position);
adapter.notifyDataSetChanged();
}
} else {
if (num == 0) {
list.add(1, list.get(position));
}
if (num == 1) {
list.add(2, list.get(position));
}
list.remove(position);
adapter.notifyDataSetChanged();
}
} else {
for (int i = 0; i < list.size(); i++) {
if (num > Integer.parseInt(list.get(i).getNum()) && num < Integer.parseInt(list.get(i + 1).getNum())) {
list.add(i + 1, list.get(position));
isAdd = true;
break;
}
}
// 如果没有比自己小的值 例如0 则isAdd=false
// 遍历list 寻找差值最小的地方插入list
if (!isAdd) {
for (int i = 0; i < list.size(); i++) {
if (i == position || list.get(i).getSetTop().equals("取消置顶")) {
// 排除与自身相比较
// 排除置顶item比较
Log.i("TAG", "调过" + i);
jumpNum++;
if (jumpNum == list.size()) {
j = list.size();
}
continue;
}
num2 = Integer.parseInt(list.get(i).getNum());
if (num2 - num < min) {
min = num2 - num;
// 记录行号
j = i;
Log.i("TAG", "插入行数J=" + j);
}
}
// 遍历完成后拿到差值min
int number = min + num;
list.add(j, list.get(position));
Log.i("TAG", "*********插入行数J=" + j);
}
list.remove(position);
adapter.notifyDataSetChanged();
}
}
这有一个大神写的demo供大家下载http://download.csdn.net/detail/qq_17250009/9228877,大家可以看看。
相关文章推荐
- 适配6.0手机的权限管理
- 代码设置TextView的drawableLeft
- 线性布局LayoutManager的RecyclerView高度随Item自适应
- 短信通信笔记
- 2015年安卓应用盗版猖獗:1款正版APP背后藏着92个盗版
- Apple Pay将会成为iOS培训的助力
- jvm 学习(一)
- VIEWGOOD(远古)教育资源管理发布平台建设方案
- O2O迎来sha手级入口:室内地图应用及展望
- 底层开发配合云端SaaS,蜂鸟的地图引擎希望提供室内便利
- 蜂鸟地图 CEO 付强:每栋建筑都该拥有三维的室内地图
- 跨平台室内三维地图引擎——FengMap公开测试
- 投资过LED导航和VR公司的他,又成为创业者在室内地图应用市场掘金
- PHP-FPM的理解
- GIT使用方法步骤
- bat脚本采用sqlplus登录oracle并若登录失败不卡住bat脚本的执行流程
- 某个sb使用Qt图形库时 用了很多的QTimer导致的问题
- JQuery里的原型prototype分析
- 自定义一个带下划线的UILable
- iOS Block回调