在我的活動中,我的佈局是一個列表視圖,其中包含複雜的行項目。所以我寫了一個類,這是一個自定義ArrayAdapter。從我的活動中,我打電話給我的ArrayAdapter,並試圖設置 偵聽器並獲取imagebutton點擊的位置,但它不起作用。 位置沒有設置在正確的值,因爲它是Android需要顯示屏幕的最後一個視圖的位置。但我怎麼才能得到已被點擊的行的正確位置? 我的意思是,例如,如果我在我的listView中有10行,並且單擊行項目5,我想要的烤麪包的信息是用戶編號5的名稱,但烤麪包機顯示位置編號爲10的行的用戶名。 .. 請幫我找不到解決方案!謝謝 !Android:如何設置監聽器並獲取imagebutton在自定義適配器中的點擊位置
這裏是我arrayadpater的代碼:
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至極叫我arrayadapter名AudioListAdapter
@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的代碼的解決方案修改哈桑(移動IF語句之外的setlistener)和Rick Falck的解決方案(將位置保存在imageview的標籤中)。它的工作原理!非常感謝 ! (見下面的代碼中的註釋)
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;
}
有點哈桑知道我有我的列表視圖的所有項目的聽衆,謝謝你的答案。問題是,當android需要在屏幕上繪製項目時,監聽器被設置,但是當我點擊我的列表視圖時,android來執行監聽器的代碼,在這一刻,我只有我的imagebutton和im無法檢索這個視圖在我的列表視圖中的位置。所以還是不行。我能怎麼做 ?是否有可能檢索這個圖像buttonview的父視圖?事實上,我只需要在列表中的位置... –
現在就可以工作(請參閱上面的解決方案)。我已經使用哈桑和瑞克的解決方案。非常感謝你 ! –