模仿QQListView左滑刪除置頂Item

 解決方法很簡單,就是在更新Listview的時候,不要使用setAdapter,若是這樣位置就會置頂了;須要更新ListView的時候,使用Adapter對象的notifyDataSetChanged方法吧。性能

  使用notifyDataSetChanged方法的時候注意了,更新列表是全部列表項都會被更新,這裏存在一個性能上 的問題,因此若是你須要改變的只是單一個列表項,建議不要使用notifyDataSetChanged方法,轉而使用得到該列表項後,而後對裏面的控件 進行調整吧。
  有些時候調用notifyDataSetChanged方法後,getView並無自行調用,這時候的解決辦法是調用listview的requestLayout方法便可。.net

/**
     * 置頂
     *
     * @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();
        }
    }rem

這有一個大神寫的demo供你們下載http://download.csdn.net/detail/qq_17250009/9228877,你們能夠看看。
get

相關文章
相關標籤/搜索