在使用自定义ListActivity时,我遇到了一个奇怪的问题。列表项通过自定义的getView绑定到数据,并且包含很少的文本视图和按钮。单击项目的按钮时,我将根据按下的按钮标签打开一个新的活动,其中包含数据项id。
问题是,有时对某个项目的一个按钮的单击实际上执行了对其他项目的单击,或者看起来是这样的。这真的很奇怪,它的作用就像我点击的按钮失去了对另一个焦点,而不是点击。当使用标准按钮时,我实际上可以看到列表按钮上的焦点出现了某种混乱,从一个按钮跳到另一个按钮。
我还没有想出这个场景,但我怀疑它与后台对getView的多个调用有某种关系。
这是我的适配器的getView实现:
public View getView(int position, View convertView, ViewGroup parent)
{
View v = convertView;
Context context = App.getContext();
if (v == null)
{
// if the view is empty, init
v = mInflater.inflate(R.layout.list_item, null);
// add click listener to the item button
Button b = (Button)v.findViewById(R.id.b);
OnClickListener lsn = new OnClickListener()
{
@Override
public void onClick(View view)
{
// when clicked we want to open the new activity with the selected id
int id = Integer.parseInt(view.getTag().toString());
Intent i = new Intent(mActivityContext, otherActivity.class);
i.putExtra("ID", id);
mActivityContext.startActivity(i);
}
};
b.setOnClickListener(lsn);
}
ItemData currItem = m_Items.get(position);
// Some fields data bindings to currItem
Button btn = (Button)v.findViewById(R.id.b);
btn.setEnabled(currItem.isButtonEnabled);
btn.setTag(currItem.getID());
return v;
}
这是我在布局上的列表定义:
<ListView android:layout_width="fill_parent" android:id="@+id/android:list"
android:fadingEdge="none" android:divider="@color/transparent" android:dividerHeight="2dp"
android:background="@color/transparent" android:focusable="false"
android:cacheColorHint="@color/transparent" android:layout_height="fill_parent"></ListView>
有什么想法吗?谢谢!
重要更新:
经过更多的测试后,我注意到在哪些条目被错误单击时存在一些一致性。一直都是镜像项目。也就是说,当单击列表中的第一项时,当我得到其他项目时,它总是最后一项!
例如,如果列表中有3项,则第一项和最后一项有时相互引用,但从不提及中间项,中间项目总是按预期工作。好像在某个地方有另一个列表与项目的顺序相反,有时我得到镜像索引而不是常规的和可见的.
真奇怪!很可能我做错了什么,但我想不出这种情况会发生。
我已经将数组适配器转换为一个类,用一个baseAdapter扩展arrayList,但是这种行为还在继续.
最后一次更新.所以我发现这个问题只有在后台运行notifyDatasetChanged时才会发生。然而,我只能减少每2秒一次的调用。使得问题更难解决但它仍然存在.
有线索吗?
发布于 2011-11-16 12:23:56
我想知道这个问题是否在您的OnClick函数中。是从OnClick定义中定义的'v‘获取标记,还是基于getView函数的第一行定义的范围?尝试将变量名更改为编译器更清楚的内容,并查看是否有相同的问题。
发布于 2011-11-16 13:10:30
我同意Wizetux关于为您的convertView变量使用更好的变量名的观点,使用一些东西而不是'v‘。
但是,我也认为,与其重写视图的onclick,您是否可以调用或使用您要扩展的ListActivity类的ListActivity(假设您的代码位于扩展ListActivity的类中)?
发布于 2011-11-16 18:19:08
您应该直接定义onClickListener,因为它是在同一个方法中声明和定义的。
另外,我不确定按钮定义和按钮的onClickListener是否应该在条件"If (v =null)“内.
直接定义onClickListener而不是使用变量的示例:
按钮b= ( Button )v.findViewById(R.id.b);
B.setOnClickListener(新的OnClickListener() {@覆盖公共无效onClick(View v) {// onClick代码} });
https://stackoverflow.com/questions/8157806
复制相似问题