正如標題所說,當我點擊物品內部的視圖時,我想知道物品的確切位置。當我點擊一個特定的視圖時,如何獲得列表視圖中項目的位置?
假設我有從ArrayAdapter的getView()方法中下面的代碼:
...
holder = new ViewHolder();
holder.iconAction = (ImageView)convertView.findViewById (R.id.download_item_iconAction);
holder.iconAction.setOnClickListener (new View.OnClickListener(){
@Override
public void onClick (View v){
//Item X is clicked
}
});
...
內的onClick()我知道被點擊,V的觀點,但我不知道的位置項目。
讓我們來做一個技巧。當getView()創建視圖時,我將在ViewHolder中保存該位置:
public View getView (int position, View convertView, ViewGroup parent){
ViewHolder holder;
if (convertView == null){
holder = new ViewHolder();
holder.iconAction = (ImageView)convertView.findViewById (id);
holder.iconAction.setOnClickListener (new View.OnClickListener(){
@Override
public void onClick (View v){
int pos = (Integer)v.getTag();
}
});
holder.iconWait.setTag (position);
...
}else{
holder = (ViewHolder)convertView.getTag();
}
...
}
此代碼有效,但並非總是如此。如果您必須滾動列表以查看視圖回收的所有項目。假設列表有10個元素,只有5個元素可見(可見的意思是:如果我們看到一個元素的1個像素行,那麼這個元素是可見的)。現在,如果我們向下滾動,我們將看到第六個元素,但第一個(0)仍然可見。我們再滾動一下,第一個元素將被隱藏,我們將看到第七個元素出現,但是這個新元素的視圖是第一個元素(0)的視圖。
所以我保存位置:0,1,2,3,4和5.第七個元素(6)將保存位置0:錯誤。
另一種方式來獲得點擊回調使用ListView的OnItemClickListener聽衆:
listView = getListView();
listView.setOnItemClickListener (new AdapterView.OnItemClickListener(){
@Override
public void onItemClick (AdapterView<?> parentView, View childView, int position, long id){
...
}
});
如果我向下滾動,我得到的確切位置,但這樣一來,我收到回調被點擊的項目時,不管點擊子視圖。
謝謝。
奇怪的是,這個非常合法的問題被壓低了! – 2011-11-25 09:17:36