3

ここに画像の説明を入力私が構築しているアプリにはリストビューがあり、実際にはサブリストを含む展開可能なリストビューがあります-クリックされたグループリスト項目に応じて2つのケースがあります.1つのサブリスト項目がある場合もあれば、2つのサブリスト項目がある場合もあります. また、1 つのサブリスト項目を含むグループ ビューをクリックすると、FrameAnimation がアクティブになります。そして、このアニメーションが開始される前にすべてのビューを完了する必要があるため、リスナー、実際には OnGlobalLayoutListener() を実装する必要があります。そして onGlobalLayout-method で、このリスナーを削除します。ここまでは順調ですね。

しかし、何が問題なのですか?問題は、フレームアニメーションを含むこのサブリストアイテムをスクロールして表示から外し、スクロールバックすると、今度は2つのサブアイテムを含む別のグループリストアイテムをクリックすると、フレームアニメーションがこのサブリストアイテムの1つに適用されることです。言い換えれば、リスナーは殺されていない、生きている!!!! なんで?

そして、CASE 2 でこのリスナーを削除しようとしましたが、このポインターを使用できなくなりました

このリスナーがまだ生きていて、それを削除する必要がある理由は何ですか?

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;
  }
4

1 に答える 1