私が構築しているアプリにはリストビューがあり、実際にはサブリストを含む展開可能なリストビューがあります-クリックされたグループリスト項目に応じて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;
}