[英]Clickable element in custom ListView row
我已經創建了一個帶有自定義行的ListView,並且在每個自定義行中,我希望可以單擊一個特定的TextView。 在自定義適配器的getView方法中,我已將onClickListener設置為TextView並根據需要實現了onClick(View v)。 這就是問題所在。
在onClick(View v)中,我需要單擊的TextView行相對於適配器數據的位置(與getView()的position參數不同)。 在閱讀了有關堆棧溢出的內容后 ,尤其是在閱讀了這篇文章之后,獲得被單擊的TextView行的位置所需的魔術代碼為:
final int position = listView.getPositionForView(v);
這段代碼很好用,每次我單擊特定行的TextView時,都會返回正確的位置。 但是,當我旋轉手機以更改配置,然后單擊任何 TextView時,返回的位置始終為-1。 將電話旋轉回原始配置還可以保持按下任何TextView時返回-1的行為。
查看getPositionForView的文檔,如果視圖“不對應於列表項(或當前不可見)”,似乎返回-1(INVALID_POSITION)。 為什么會這樣呢? 顯然,對我來說,甚至還可以單擊TextView,該視圖必須在屏幕上可見。
如果很重要,我將使用convertView和ViewHolder模式來優化ListView。
我想念什么?
更新:為了幫助更好地可視化,這是我的getView大致的樣子
getView(int position, View convertView, ViewGroup parent) {
final CustomViewHolder holder;
View = rowView;
if (convertView == null) {
rowView = inflater.inflate(R.layout.listitem, parent, false);
holder = new CustomViewHolder(rowView);
holder.textview.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final int position = listView.getPositionForView(v);
//position is always -1 after configuration change
Log.d(TAG, "Like button pushed at position: " + position);
}
});
rowView.setTag(postHolder);
} else {
rowView = convertView;
postHolder = (PostListUserPostHolder) convertView.getTag();
}
//fill list item with data
}
return rowView;
}
更新#2我似乎已經解決了。 我沒有將對片段的ListView的引用傳遞給適配器,而是將對片段本身的引用傳遞給了適配器。 然后,我在片段中提供了一個getter方法以獲得ListView,然后使用該行:
final int position = fragment.getListView().getPositionForView(v);
我以為這與我所做的基本上相同,但事實並非如此。 如果有人可能對可能發生的事情有所了解,將不勝感激。 否則,我很高興代碼現在可以按預期運行!
getView(int position, View convertView, ViewGroup parent) {
final CustomViewHolder holder;
if (convertView == null) {
rowView = inflater.inflate(R.layout.listitem, parent, false);
holder = new CustomViewHolder();
convertView .setTag(holder );
}
else {
holder= (CustomViewHolder ) convertView.getTag();
}
holder.textview.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final int position = listView.getPositionForView(v);
//position is always -1 after configuration change
Log.d(TAG, "Like button pushed at position: " + position);
}
});
}
//fill list item with data
}
return convertView;
}
您的getView()有點奇怪。 您的持有人的字段textview
從未初始化?
持有人的用處是限制方法findViewById
的使用。
這是我會使用的骨架:
static class ViewHolder {
public TextView textview;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View rowView = convertView;
// reuse views
if (rowView == null) {
LayoutInflater inflater = context.getLayoutInflater();
rowView = inflater.inflate(R.layout.listitem, null);
// configure view holder
ViewHolder viewHolder = new ViewHolder();
viewHolder.textview= (TextView) rowView.findViewById(R.id.textview);
rowView.setTag(viewHolder);
}
else {
ViewHolder holder = (ViewHolder) rowView.getTag();
}
// fill data
holder.textview.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final int position = listView.getPositionForView(v);
//position is always -1 after configuration change
Log.d(TAG, "Like button pushed at position: " + position);
}
});
return rowView;
}
}
希望它能解決您的問題!
祝你今天愉快 !
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.