[英]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.