我在使用自定义ArrayAdapter的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个项目,则第一个和最后一个有时相互引用但从不引用中间项目,中间项目始终按预期工作。 好像某处有另一个列表,其中包含相反的项目顺序,有时我会得到镜像索引,而不是常规和可见的索引...
真的很奇怪!我很可能做了一件非常糟糕的事情,但我无法想到这种情况会发生的情况。
我已经将数组适配器转换为带有arrayList的类extends baseAdapter,但行为仍在继续......
上次更新... 所以我发现只有当notifyDatasetChanged在后台运行时才会发生此问题。但是我每2秒钟只能减少一次呼叫。导致问题难以捕捉,但它仍然存在......
任何线索?
答案 0 :(得分:0)
我不得不怀疑问题是否在你的OnClick函数中。是“v”,您从OnClick定义中定义的'v'获取标记,还是基于范围是您在getView函数的第一行中定义的v?尝试将变量名称更改为编译器更清晰的名称,并查看是否出现相同的问题。
答案 1 :(得分:0)
我同意Wizetux关于为convertView变量使用更好的变量名,使用某些东西而不是'v'。
但是,我也认为不是覆盖视图的onclick,而是调用或使用你正在扩展的ListActivity类的onListItemClick(假设你的代码在扩展ListActivity的类中)?
答案 2 :(得分:0)
您应该直接定义onClickListener,因为它是在同一个方法中声明和定义的。
另外,我不确定按钮的按钮定义和onClickListener是否应该在条件“If(v = null)”中...
直接定义onClickListener而不是使用变量的示例:
按钮b =(按钮)v.findViewById(R.id.b);
b.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v){ // onClick代码 } });