0

지금은 expandablelistview에 관한 문제가 있습니다. 문제는 onChildClickListener와 getChildView 사이에 충돌이있는 것 같습니다.OnChildClickListener를 호출 한 후 getChildView의 ImageView가 더 이상 업데이트되지 않습니다.

간단히 : 하나는 groupitem를 클릭하면 두 submenuitems가 나타납니다. 이 (2) 하위 메뉴에는 이미지를로드하는 이미지 뷰가 있습니다. 그리고이 항목들 중 하나가 클릭되면 또 다른 이미지 뷰가 생성됩니다 - 이번에는 onChildClickListener 메서드를 사용하십시오. 여태까지는 그런대로 잘됐다. 그러나 하나의 응용 프로그램에서 다른 그룹 항목을 계속 확장하는 경우 - onChildClickListener-method에서 생성 된 이미지 뷰가 여전히 존재합니다 (getChildView의 이미지 뷰가 아님).

나는 당신이 여기에서 찾을 수 있습니다 스택에 비슷한 질문을 발견했다. 그러나 문제는 리스너와 getGroupView 사이에있었습니다.

custom views not updating with OnGroupClickListener on ExpandableListView

그 이유는 무엇입니까? 캐싱과 관련이 있습니까? 어떤 제안이라도이 모든 문제를 해결하는 방법은 무엇입니까? 여러 가지 방법을 시도했습니다 ... invalidate(), invalidateviews(), setWillNotCacheDrawing (true), setItemsCanFocus (false) 등등.

요약하면 : onchildclicklistener가 호출 될 때 - getchildview의 이미지가 더 이상로드되지 않고 청취자의 이미지 만 요약됩니다. 청취자

expListW.get().setOnChildClickListener(new ExpandableListView.OnChildClickListener() { 
    public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { 
     Object e = (Object)adapterW.get().getChild(groupPosition, childPosition); 
     int nmbr_childs = adapter.getChildrenCount(groupPosition); 
     final int group_position = groupPosition; 

     switch (childPosition) { 
     case 0: 
      if (nmbr_childs > 1) { 
       myVoice = soundPool.load(PhraseActivity.wr.get(), sound[group_position][0], 2); 
       soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() { 
         @Override 
         public void onLoadComplete(SoundPool soundPool, int sampleId, 
          int status) { 
          soundPool.play(myVoice, 20, 20, 1, 0, 1f); 
         } 
       }); 
       speakerImage = (ImageView) v.findViewById(R.id.single); 
       speakerImage.setBackgroundResource(R.drawable.smile); 
      } 
      else { 
       myVoice = soundPool.load(PhraseActivity.this, sound[group_position][0], 2); 
       soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() { 
         @Override 
         public void onLoadComplete(SoundPool soundPool, int sampleId, 
          int status) { 
          soundPool.play(myVoice, 20, 20, 1, 0, 1f); 
         } 
       }); 
       speakerImage = (ImageView) v.findViewById(R.id.single); 
       speakerImage.setBackgroundResource(R.drawable.smile); 
      } 
      break; 
     case 1: 
      myVoice = soundPool.load(PhraseActivity.this, sound[group_position][1], 2); 
      soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() { 
        @Override 
        public void onLoadComplete(SoundPool soundPool, int sampleId, 
         int status) { 
         soundPool.play(myVoice, 20, 20, 1, 0, 1f); 
        } 
      }); 
      speakerImage = (ImageView) v.findViewById(R.id.single); 
      speakerImage.setBackgroundResource(R.drawable.smile); 
     break;    
     } 
      return true; 
     } 
    }); 

여기에 getChildView-방법입니다 아래

...

 public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     final ViewHolder holder; 
     if (convertView == null) { 
      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.icon); 
      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.setImageResource(0); 
      holder.imageView2.setBackgroundResource(0); 
      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); 


      ViewTreeObserver 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.setBackgroundResource(R.drawable.animation3); 
       frameAnimation = (AnimationDrawable) holder.imageView2.getBackground(); 
       frameAnimation.start(); 
      }}); 
      break; 

     case 2: 
      holder.imageView.setImageResource(0); 
      holder.imageView2.setBackgroundResource(0); 
      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.setImageResource(R.drawable.man_33); 
        break; 
       case 1: // Kvinna. 
        holder.imageView.setImageResource(R.drawable.woman_33); 
        break; 
      } 
      break; 
     } 
     notifyDataSetChanged(); 
     return convertView; 
    } 

도움을 매우 greatful !!!!!

답변

0

나는 내 자신의 질문을 해결했다고 생각합니다. 실제 이미지보기에 대해 bringToFront()를 호출하면됩니다. 예를 들어, imageHolder가 imageView를 유지하는 경우 :

holder.imageView.bringToFront().

관련 문제