关于listview中是用多个布局 并使用holderView 缓存机制的问题

来源:互联网 发布:网络剧投资 编辑:程序博客网 时间:2024/05/18 00:35

今天碰到一个关于listview 中使用2个或多个不同的布局的问题,由于我的listview 的一个item 其实就是一个activity 界面相当大 也就是说 我的每个item 的内容相当多,所以如果不用缓存机制,那是相当的卡 就相当于每次在创建一个activity 非常的卡顿的! 处于这种问题 就只能使用缓存机制了!缓存机制的使用加载两个布局,那么当你去gettag的时候 在两个不同的item布局间切换时 绝对会爆炸! 原因这个就相当简单了 是两个不同的tag之间 由于你的两个布局不同 是不能进行转化的! 我再往上找了许多方法, 网上都是一些没有使用缓存机制的 根本就不会存在这样的问题 他们都是直接new 每个布局,当然 他们的布局内容量相当小,不像我这么大!又或者说他们使用了缓存机制,但是num 是不足的 一次就加载完了 而真正意义上的缓存机制根本没使用 ,只是代码那样写 其实当num大了 他们的是会炸的 (说明:我只是说我看到的 ,因为他们给的和我初始的代码基本相同,所谓的核心他们是没有的);
如何解决问题:
这里给大家一个方法:但是个人总觉得有点别扭 ,希望有更好方法的小伙伴给出更好的方法;
方法如下:
在gettag的时候我们使用异常来处理,抛出异常就从新加载一次界面,不过不是让大家去再去new 太费事了,直接在catch中写一句 return getView(position,null,parent);
特别说明:为了保证当前的数据,千万别改position 和parent 只需要把view改为null 就能解决了 从新掉一次该方法 这里给大家说一下 最好使用return语句;
给大家看看我的代码写法:

  public View getView(int position, View convertView, ViewGroup parent) {      /**       * @params: twotable onetable分别是我的两个holderview       */            if (position == datalist.size() - 1) {// 应该加载检验第二界面的数据                if (convertView == null) {                    convertView = LayoutInflater.from(Wr_flag.this).inflate(R.layout.activity_wr_wrj_two, null);                    two = new twoTable();                    initTwo(convertView);//初始化two的界面                    convertView.setTag(two);                }else {                       try {                           two=(twoTable) convertView.getTag();                    } catch (Exception e) {                           return   getView(position, null, parent);//return                      }                }                setTwoInfo(position);            }            if(position<datalist.size()-1) {                 if(convertView==null) {                       convertView=LayoutInflater.from(Wr_flag.this).inflate(R.layout.wr_wrj_jyjl, null);                       one=new  oneTable();                       initOne(convertView);                       convertView.setTag(one);                    }else {                          try {                              one=(oneTable) convertView.getTag();                        } catch (Exception e) {                               return   getView(position, null, parent);                        }                    }                    setOneInfo(position);            }            return convertView;        }  

谢谢大家观赏,暂时没想出其他的号办法有好办法的或者想法的小伙伴留个代码再走

阅读全文
0 0