文档章节

模仿QQListView左滑删除置顶Item

xunfang
 xunfang
发布于 2016/03/03 15:27
字数 549
阅读 580
收藏 0

 解决方法很简单,就是在更新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,大家可以看看。

本文转载自:http://download.csdn.net/detail/qq_17250009/9228877

共有 人打赏支持
xunfang
粉丝 0
博文 51
码字总数 7950
作品 0
海淀
程序员
仿QQ消息控件--SwipeRefreshDemo

SwipeRefreshDemo 自定义组合控件上拉+下拉+左滑删除置顶 look at the screenshot: 使用方法 build.gradle文件 compile 'com.hankkin:swiperefresh:1.0.1 xml引用 <com.hankkin.library.Ref......

赖小懒
2016/04/25
980
0
Jaynm/PullToRefreshListView

PullToRefreshScrollViewDemo Android使用PullToRefresh完成ListView下拉刷新和左滑删除 一、本文主要内容: 使用PullToRefresh完成ListView下拉、上拉刷新; 扩展PullToRefresh完美的实现L...

Jaynm
2016/11/03
0
0
android中listview左滑删除,点击删除按钮的时候,总是从删除最后一行,什么原因

listview左滑删除,点击删除按钮的时候,总是从删除最后一行, listview里面每个item都是一个list.get(position),list集合里面有几个数组,填充每个item的控件 //...

寻问学者
2016/04/11
908
2
一步步实现一个自适应的react-native拖拽排序

最近由于业务需求需要实现一个功能需要实现图片的上传和排序和删除,在网上搜索了几款发现都需要固定列数,感觉不太友好,所以自己实现了一个可以不需要设定列数的排序,而且布局高度实现自适...

mochixuan
08/08
0
0
Layx —— 仿真 Win10 窗口界面的网页弹窗插件

Layx 是一款纯原生Javascript编写的网页弹窗插件,完全模仿Windows 10操作系统窗口进行设计开发。目前Layx具备以下功能:支持文本窗口、页面窗口(iframe);支持最大化、最小化、恢复、关闭...

王练
05/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

hive分桶

hive为啥分桶? 更加细粒度的划分数据,既可以使用分桶技术实现。 作用 对数据进行抽样查询,较为高效。 可以使查询效率提高。 hive分桶技术 分桶字段是表内字段,默认是对分桶的字段进行has...

Mr_yul
30分钟前
2
0
SQL中的case when then else end用法

Case具有两种格式。简单Case函数和Case搜索函数。 --简单Case函数CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女'ELSE '其他' END--Case搜索函数CASE WHEN sex...

牛奋Debug
50分钟前
1
0
log4j2发送消息至Kafka

title: 自定义log4j2发送日志到Kafka tags: log4j2,kafka 为了给公司的大数据平台提供各项目组的日志,而又使各项目组在改动上无感知。做了一番调研后才发现log4j2默认有支持将日志发送到kaf...

微笑向暖wx
59分钟前
1
0
LINUX中如何查看某个端口是否被占用(转发)

LINUX中如何查看某个端口是否被占用 之前查询端口是否被占用一直搞不明白,问了好多人,终于搞懂了,现在总结下: 1.netstat -anp |grep 端口号 如下,我以3306为例,netstat -anp |grep 33...

覃大光
今天
1
0
JBolt 1.5.0新版发布,升级到支持最新版JFinal和Jetty,实现了在线更新插件功能

JBolt是一个JFinal极速开发框架 定制版IDE插件 目前仅有Eclipse插件版,Idea插件版正在开发中。 JBolt的详细使用教程请移步到这里 =====版本1.5.0 更新内容 2018年10月13日10:41:52===== 注意...

山东-小木
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部