zoukankan      html  css  js  c++  java
  • Android之记录ListView标记行的状态

    小Demo无什么特别之处,最特别的就是尽量少用notifyDataSetChanged,开销太大了,当然使用是会省不少工的,不过有时候还是会遇到别的问题的,项目经验表示会有这个可能性的,废话不多少了,直接上关键代码。

    @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int pos, long arg3) {
            
            /**
             * 在ListView中,使用getChildAt(index)的取值,只能是当前可见区域(列表可滚动)的子项!
            1、所以如果想获取前部的将会出现返回Null值问题;
            2、getChildCount跟getCount获取的值将会不一样(数量多时);
            3、如果使用了getChildAt(index).findViewById(...)设置值的话,滚动列表时值就会改变了。
                   需要使用getFirstVisiblePosition()获得第一个可见的位置,在用当前的position-getFirstVisiblePosition(),再用getChildAt取值!
             * */
            int now_pos = pos - adapterView.getFirstVisiblePosition();
            View v = adapterView.getChildAt(now_pos);
            ImageView imageView = (ImageView) v.findViewById(R.id.image);
            
            if (imageView.getVisibility() == View.VISIBLE) {
                imageView.setVisibility(View.GONE);
                adapter.setState(pos,NONBIAOZHI);
            }else{
                imageView.setVisibility(View.VISIBLE);
                adapter.setState(pos,BIAOZHI);
                // getView調用,不過非常耗費性能
    //            adapter.notifyDataSetChanged();
                // 不使用notifyDataSetChanged,getView不會刷新,提高效率
                refreshListView(pos, imageView);
            }
        }
    public void refreshListView(int pos, ImageView imageView) {
            if(pre != pos && !hasmap.isEmpty()){
                ImageView image = (ImageView) hasmap.get(pre);
                image.setVisibility(View.GONE);
                hasmap.remove(pre);
            }
            pre = pos;
            hasmap.put(pre, imageView);
        }


    上面的是在Activity的方法片段,下面的是BaseAdapter的方法片段:

        // 設置標記
        public void setState(int pos,int state){
            if(state == MainActivity.BIAOZHI){
                // 每次點擊都清空列表,保持唯一選擇性
                map.clear();
                map.put(pos, 1);
            }else{
                map.remove(pos);
            }
        }
        
        // 檢測標記
        public boolean getState(int p){
            if (!map.isEmpty() && map.containsKey(p)) {
                return true;
            }else
                return false;
        }
    
    =============================
    getView代码:
            // 固定显示标记的行
            if (getState(position)) {
                holder.imageView.setVisibility(View.VISIBLE);
            }else
                holder.imageView.setVisibility(View.GONE);

    附上项目下载,自己运行就会得到标题的效果。ListViewClickTest.zip

  • 相关阅读:
    高级特性(4)- 数据库编程
    UVA Jin Ge Jin Qu hao 12563
    UVA 116 Unidirectional TSP
    HDU 2224 The shortest path
    poj 2677 Tour
    【算法学习】双调欧几里得旅行商问题(动态规划)
    南洋理工大学 ACM 在线评测系统 矩形嵌套
    UVA The Tower of Babylon
    uva A Spy in the Metro(洛谷 P2583 地铁间谍)
    洛谷 P1095 守望者的逃离
  • 原文地址:https://www.cnblogs.com/lee0oo0/p/3073528.html
Copyright © 2011-2022 走看看