내 활동에서 내 레이아웃은 복잡한 행 항목이 포함 된 목록보기입니다. 그래서 사용자 정의 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;
}
작은 hassan은 listview의 모든 항목에 리스너가 있다는 것을 알고 있습니다. 답변 해 주셔서 감사합니다. 문제는 안드로이드가 안드로이드가 화면에 항목을 그릴 필요가있을 때 리스너가 설정되었을 때입니다. 그러나 목록보기를 클릭하면 안드로이드가 청취자의 코드를 실행하게되고이 순간에 나는 imagebutton과 im을 검색 할 수 없게됩니다. 내 listview 에서이보기의 위치. 그래도 여전히 작동하지 않습니다. 어떻게해야합니까? 이 이미지 buttonview의 부모보기를 검색 할 수 있습니까? 사실 난 그냥 목록에있는 위치가 필요합니다 ... –
이제 괜찮습니다 (위의 솔루션 참조). 나는 Hassan과 Rick의 해답을 사용했다. 고마워요! –