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

  • 相关阅读:
    在Kubernetes集群里安装微服务DevOps平台fabric8
    Kubernetes PV/PVC使用实践
    Kubernetes集群中Service的滚动更新
    jenkins权限管理,不同用户显示不同项目
    SSH连接与自动化部署工具paramiko与Fabric
    kubernetes 之ingress
    理解Docker(8):Docker 存储之卷(Volume)
    Rancher Server HA的高可用部署实验-学习笔记
    2015 年总结
    2015 年总结
  • 原文地址:https://www.cnblogs.com/lee0oo0/p/3073528.html
Copyright © 2011-2022 走看看