android-无法删除getChildView中的OnGlobalLayoutListener()

android-无法删除getChildView中的OnGlobalLayoutListener(),第1张

概述在我构建的应用程序中,有一个列表视图,实际上是一个带有子列表项的可扩展列表视图-根据单击的组列表项有两种情况:有时有一个子列表项,有时有两个子列表项.当单击包含一个子列表项的组视图时,将激活FrameAnimation.而且由于必须在启动此动画之前完成每个视图,所以我必须实现一个监听

在我构建的应用程序中,有一个列表视图,实际上是一个带有子列表项的可扩展列表视图-根据单击的组列表项有两种情况:有时有一个子列表项,有时有两个子列表项.当单击包含一个子列表项的组视图时,将激活FrameAnimation.而且由于必须在启动此动画之前完成每个视图,所以我必须实现一个监听器,实际上是OnGlobalLayoutListener().然后在onGlobalLayout方法中删除此侦听器.到现在为止还挺好.

但是问题是什么呢?问题是,如果我滚动该包含子视图的子项目,然后向后滚动-然后单击另一个包含两个子项目的组项目,则框架动画会应用到其中一个子项目.换句话说-听众没有被杀,它还活着!为什么?

而且我尝试在案例2中删除此侦听器,但现在无法使用指针this

为什么这个听众还活着并希望将其删除,这是什么原因?

public VIEw getChildVIEw(int groupposition, int childposition, boolean isLastChild, VIEw convertVIEw, VIEwGroup parent) {      final VIEwHolder holder;      if (convertVIEw == null) {          LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);          convertVIEw = inflater.inflate(R.layout.activity_subphrase, parent, false);          holder = new VIEwHolder();          holder.text = (TextVIEw) convertVIEw.findVIEwByID(R.ID.label_single);          holder.text2 = (TextVIEw) convertVIEw.findVIEwByID(R.ID.label_couple);          holder.imageVIEw = (ImageVIEw) convertVIEw.findVIEwByID(R.ID.single);          holder.imageVIEw2 = (ImageVIEw) convertVIEw.findVIEwByID(R.ID.couple);          convertVIEw.setTag(holder);      } else {            holder = (VIEwHolder) convertVIEw.getTag();      }      final int nChildren = getChildrenCount(groupposition);      final VIEw v = convertVIEw;      switch (nChildren) {        case 1:            holder.imageVIEw.setBackgroundResource(0);            holder.imageVIEw2.bringToFront();            holder.text.setText(null);            holder.text2.setText(contents[groupposition][childposition]);            holder.imageVIEw2.setBackgroundResource(R.drawable.man_woman_3);            //extra(groupposition, category, holder.text, convertVIEw, parent);            showThaiImages(groupposition, holder.text, convertVIEw, parent);            // Väntar till all layout är avklarad - efter detta bearbetas animering.             vto = convertVIEw.getVIEwTreeObserver();            vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {             public voID onGlobalLayout() {                v.getVIEwTreeObserver().removeOnGlobalLayoutListener(this);  //vet inte om denna metod är nödvändig                holder.imageVIEw2.bringToFront();                holder.imageVIEw2.setBackgroundResource(R.drawable.animation3);                frameAnimation = (AnimationDrawable) holder.imageVIEw2.getBackground();                frameAnimation.start();            }});             break;        case 2:            try {                System.out.println("VIEwTreeObserver is alive = : " + vto.isAlive());            } catch (Exception e) {                e.printstacktrace();            }            v.getVIEwTreeObserver().removeOnGlobalLayoutListener(this);            holder.imageVIEw2.setBackgroundResource(0);            holder.imageVIEw.bringToFront();            holder.text2.setText(null);            //holder.imageVIEw.invalIDate();            holder.text.setText(contents[groupposition][childposition]);            switch (childposition) { // Switch-villkor för man eller kvinna.                 case 0: // Man.                    holder.imageVIEw.setBackgroundResource(R.drawable.man_3);                    break;                case 1: // Kvinna.                    holder.imageVIEw.setBackgroundResource(R.drawable.woman_3);                    break;            }            break;      }      notifyDataSetChanged();      return convertVIEw;  }

解决方法:

我也遇到类似的问题,它也与扩展ListvIEw有关.
我构建了一个适配器,该适配器显示带有动画的列表项,并支持inscrollvIEw显示.
但是,我在计算扩展vIEwGroup的高度时遇到问题.
即使在重写的OnDraw()OnLayout()中,vIEwGroup的展开高度始终为0.

最后,我使用OnGlobalLayoutListener来检测何时更改高度.
另外,从不删除OnGlobalLayoutListener,并且以某种方式在同一视图上堆叠了越来越多的OnGlobalLayoutListener.

我想过的是过时功能阻止侦听器被删除.
但是将其更改为:

@Suppresslint("NewAPI")public static voID removeOnGlobalLayoutListener(VIEw v,        VIEwTreeObserver.OnGlobalLayoutListener Listener) {    if (Build.VERSION.SDK_INT < 16) {        v.getVIEwTreeObserver().removeGlobalOnLayoutListener(Listener);    } else {        v.getVIEwTreeObserver().removeOnGlobalLayoutListener(Listener);    }}

仍在寻找删除它的方法.

编辑:
刚发现可能的原因.就我而言,当其他ListvIEw项被展开时,也会触发onLayoutListener.这可能是由于一个ListvIEw项的扩展导致另一项要重新布局,并因此触发了onLayoutListener所致.

实际上,就我而言,onLayoutListener已删除.

总结

以上是内存溢出为你收集整理的android-无法删除getChildView中的OnGlobalLayoutListener()全部内容,希望文章能够帮你解决android-无法删除getChildView中的OnGlobalLayoutListener()所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1076286.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存