0

내 활동에서 내 레이아웃은 복잡한 행 항목이 포함 된 목록보기입니다. 그래서 사용자 정의 ArrayAdapter 클래스를 작성했습니다. 내 활동에서 내 ArrayAdapter를 호출하고 청취자를 설정하고 imagebutton click의 위치를 ​​얻으려고했으나 작동하지 않습니다. 안드로이드가 screen.But을 표시해야하는 마지막 뷰의 위치이기 때문에 위치가 올바른 값으로 설정되지 않았습니다. 그러나 클릭 한 행의 올바른 위치를 얻으려면 어떻게해야합니까? 예를 들어 listView에 10 개의 행이 있고 행 항목 5를 클릭하면 토스트로 원하는 정보가 사용자 번호 5이지만 토스트는 위치 번호 10에있는 행의 사용자 이름을 표시합니다. .. 솔루션을 찾을 수 없습니다. 고맙습니다 ! 여기 Android : 리스너를 설정하고 imagebutton의 위치를 ​​사용자 정의 어댑터에서 클릭하는 방법

내 arrayadpater의 코드입니다 : 여기의 솔루션을 수정 ArrayAdapter와 내 코드입니다 : 여기

public class AudioListAdapter extends ArrayAdapter<DonneesListeAudio> { 

// Variables 
private Activity activity; 
private ArrayList<DonneesListeAudio> DataOfListView; 
private static LayoutInflater Inflater = null; 
int classPosition=0; 

//Constructeur 
public AudioListAdapter(Activity activity, int textViewResourceId, ArrayList<DonneesListeAudio> _Liste) { 
    super(activity, textViewResourceId, _Liste); 
    try { 
     this.activity = activity; 
     this.DataOfListView = _Liste; 
     Inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } catch (Exception e) { 
    } 
} 

//construction de la vue de l'item 
public View getView(int position, View convertView, ViewGroup parent) { 
    classPosition = position; 
    View ItemView = convertView; 
    ViewWrapper Holder; 
    try { 
     if (convertView == null) { 
      ItemView = Inflater.inflate(R.layout.row_liste_audio, null); /* création de la vue */ 

      Holder = new ViewWrapper(ItemView);       /* création d'une instance de wrapper pour conservation des objets de la vue (textview etc ..)dans le tag de la vue */ 

      // >>>>>>>>>>>>>>> HERE WAS MY LISTENER BEFORE HASSAN ANSWER 
      ImageButton MyImageButton = (ImageButton) Holder.getBase().findViewById(R.drawable.ic_playvert);  /* listner 1 */ 
      MyImageButton.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        Toast ToastCourt = Toast.makeText(getContext(), DataOfListView.get(classPosition).getPseudoUser(), Toast.LENGTH_SHORT); 
        ToastCourt.show(); 
       } 
      }); 
      ItemView.setTag(Holder);          /* sauvegarde du Wrapper de nom Holder dans le tag de la vue crée*/ 
     } else { 
      Holder = (ViewWrapper) ItemView.getTag();      /* récupération des objets de la vue (textview etc ..) via le Wrapper stocké dans le tag */ 
     } 
     chargementDesDonneesDeItem(Holder, position);      /* chargement des données provenants de MyApplication dans le Wrapper de nom Holder */ 
    } catch (Exception e) { 
    } 
    return ItemView; 
} 

내 listactivity이

@Override 
public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); /* suppresion barre de titre */ 
    setContentView(R.layout.activity_audio); 

    //footer (pied de page) de la listView (à appeler avant l'adapteur) 
    View footer = getLayoutInflater().inflate(R.layout.footer, null); 
    ListView listView = getListView(); 
    listView.addFooterView(footer); 

    //chargement des données de la premeire page de la listview via LA thread 
    chargeListe(0, "PremierePage", "aucun"); 
    setListAdapter(new AudioListAdapter(this, 0, MyApplication.getMyArrayDonneesListeAudio())); 

SOLUCE 내 ArrayAdapter와 이름 AudioListAdapter 전화 이십 기가 바이트입니다 Hassan (IF 문 외부에서 setlistener 이동) 및 Rick Falck의 솔루션 (이미지 뷰의 태그에서 위치를 저장). 그리고 그것은 작동합니다! 정말 고맙습니다 ! (아래 코드에 주석을 참조)

public View getView(int position, View convertView, ViewGroup parent) { 
    classPosition = position; 
    View ItemView=convertView; 

    try { 
     if (convertView == null) { 
      convertView = Inflater.inflate(R.layout.row_liste_audio, null); /* création de la vue */ 

      Holder = new ViewWrapper(convertView);       /* création d'une instance de wrapper pour conservation des objets de la vue (textview etc ..)dans le tag de la vue */ 

      convertView.setTag(Holder);          /* sauvegarde du Wrapper de nom Holder dans le tag de la vue crée*/ 

     } else { 

      Holder = (ViewWrapper) convertView.getTag();      /* récupération des objets de la vue (textview etc ..) via le Wrapper stocké dans le tag */ 


     }; 


     chargementDesDonneesDeItem(Holder, position);      /* chargement des données provenants de MyApplication dans le Wrapper de nom Holder */ 


     ImageView MyImageView = (ImageView)convertView.findViewById(R.id.image_media_play);  /* get instance of the button */ 
     PositionObject TagPosition = new PositionObject();          /* create a new object for tag (just save position as an INT */ 
     TagPosition.setPosition(classPosition);             /* set position in the object for tag */ 
     MyImageView.setTag(TagPosition);              /* save tag with position */ 
     MyImageView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) {            /* set the listener here to be sure that listener exist even when items convertview are recycled */ 
       int idx; 
       PositionObject MyPosition = (PositionObject) view.getTag();      /* get the tag of the view that was click */ 
       idx=MyPosition.getPosition();             /* get the position of the view in the listitem ! */ 
       Toast ToastCourt = Toast.makeText(getContext(), DataOfListView.get(idx).getPseudoUser(), Toast.LENGTH_SHORT); 
       ToastCourt.show(); 


      } 
     }); 




    } catch (Exception e) { 
      e.getCause(); 
      e.getLocalizedMessage(); 
      e.toString(); 
      e.printStackTrace(); 


    } 
    return convertView; 
} 
+0

작은 hassan은 listview의 모든 항목에 리스너가 있다는 것을 알고 있습니다. 답변 해 주셔서 감사합니다. 문제는 안드로이드가 안드로이드가 화면에 항목을 그릴 필요가있을 때 리스너가 설정되었을 때입니다. 그러나 목록보기를 클릭하면 안드로이드가 청취자의 코드를 실행하게되고이 순간에 나는 imagebutton과 im을 검색 할 수 없게됩니다. 내 listview 에서이보기의 위치. 그래도 여전히 작동하지 않습니다. 어떻게해야합니까? 이 이미지 buttonview의 부모보기를 검색 할 수 있습니까? 사실 난 그냥 목록에있는 위치가 필요합니다 ... –

+0

이제 괜찮습니다 (위의 솔루션 참조). 나는 Hassan과 Rick의 해답을 사용했다. 고마워요! –

답변

1

간단히하여 if 문 범위에서 그리고 다른 범위 후 다음 걸릴.

당신은 때마다 그렇게해야이 논리를 바탕으로

final int positionForListener = position; 
ImageButton MyImageButton = (ImageButton) Holder.getBase().findViewById(R.drawable.ic_playvert);  /* listner 1 */ 
      MyImageButton.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        Toast ToastCourt = Toast.makeText(getContext(), DataOfListView.get(classPosition).getPseudoUser(), Toast.LENGTH_SHORT); 
        ToastCourt.show(); 
        Log.i("position", ""+positionForListener); 
       } 
      }); 

당신이 코드 어디를 설정하는 방법의 다른 라인을 재고 할 필요가있다. 하지만 지금은 문제가 해결됩니다.

이 방법도 유용합니다. 리스너의 최종 위치 var를 정의한 다음 리스너와 함께 사용하십시오.

+0

감사합니다 하산 –

0

재생할보기를 설정할 때 수신기를 설정하지 마십시오. 재활용 될 때 청취자도 마찬가지가되며 청취자와 관련된 잘못된 위치를 갖게됩니다.

다양한 잠재적 인 솔루션 :

  • 뷰를 재활용하지 마십시오. 효율성은 떨어지지 만 매번 새로운 뷰를 팽창시키고 채우면 재활용 된 뷰의 데이터를 재활용 할 때 문제가 발생하지 않습니다.
  • 버튼 대신 AdapterView.setOnItemClickListener을 사용하십시오. 전체 목록 항목은 버튼 대신 클릭 할 수 있으며 올바른 위치가 자동으로 처리됩니다.
  • 새보기 대신 재생 된보기를 설정할 때 수신기를 설정하십시오.
1

문제는 View.OnClickListener가 AudioListAdapter의 내부 클래스이기 때문입니다. getView() 메소드는 항목을 그릴 필요가있을 때 어댑터에 의해 호출됩니다. 그것은 그릴 항목의 위치를 ​​갖습니다.

ImageView를 클릭하면 onClick() 메서드가 호출됩니다. 이때 외부 클래스의 데이터는 클릭 한 것이 아닌 마지막으로 그려진 항목을 나타냅니다. 따라서 classPosition이 마지막으로 그려지는 항목이며 # 10입니다.

onClick()에 전달 된보기는 ImageView 자체입니다. 그것이 속한 항목을 알아 내야합니다. 내가 생각할 수있는 유일한 방법은 항목의 위치를 ​​ImageView.Tag (ImageView.setTag())에 넣는 것입니다. 그런 다음 onClick()에서 위치를 얻습니다 (ImageView.getTag()).

그런 다음 해당 위치에서 getItem (posFromTag)을 호출하여 DataOfListView에서 항목을 가져올 수 있습니다. 거기에서 필요한 정보를 얻을 수 있습니다.

+0

당신은 그것을 작동 핥아 –