【发布时间】:2017-01-02 03:23:08
【问题描述】:
我有 2 个弹出窗口。在第一个弹出窗口中,我有 ListView 和可选项目。当我从第一个列表中单击项目时,会出现第二个弹出窗口,其中还有 ListView 以及可供选择的选项。
我已经将第一个列表视图项实现为自定义 View 并订阅视图构造函数内的点击,如下所示:
class CustomListItem extends RelativeLayout{
public CustomListItem(){
...
//inflating stuff there
((Button)findViewById(R.id.listItemButton)).setOnClickListener(
//This code not working as expected, but then could fire a lot of times
v -> System.out.println("item clicked");
);
}
}
当我第一次打开第一个对话框时,onClick 处理程序按预期触发并出现第二个弹出窗口。但是当我关闭第二个弹出窗口并返回(调用Dialog.dismiss() 弹出窗口)到第一个弹出窗口时,第一个列表视图上的onClick 处理程序停止工作。还有一些其他有趣的东西:
-
onTouch列表视图项的侦听器仍在工作(要求action=ACTION_DOWN和action=ACTION_UP); - 当我设置 listview
onItemClickListener它总是被调用 (第一次弹出窗口打开并返回时); - 当我多次单击列表视图中的项目时,有时
onClick发生,之后它被调用的次数与我点击的次数一样多 之前。
您有什么想法可能是问题的原因吗?
更新
似乎适配器内部的getView 方法有问题。我尝试在其中创建一个自定义列表项控件(或从缓存中获取):
@Override
public View getView(int position, View view, ViewGroup parent) {
if (!constructedViewCache.containsKey(position)) {
constructedViewCache.put(position, new CustomListItem ());
}
return constructedViewCache.get(position);
}
当我将此代码更改为以下代码时,一切正常:
@Override
public View getView(int position, View view, ViewGroup parent) {
if (view == null)
{
view = LayoutInflater.from(context).inflate(R.layout.list_view_item, null);
}
view.setOnClickListener(v -> {
v -> System.out.println("item clicked");
});
return view;
}
为什么不能使用new CustomListItem () 创建视图?或者如果可能的话我应该怎么做?
【问题讨论】:
-
我理解正确吗,onclick 不能正常工作,但是如果你点击很多次,比如说 20-30 它可能会触发,之后 onclick 的代码将被执行 20-30 次?跨度>
-
你能分享更多代码吗?
-
@vovaxo 完整的代码非常复杂。哪部分代码可能对你有用?
-
@silent_coder 是的,你是对的
-
@Natasha 这取决于您单击的位置还是您尝试单击一次然后等待?
标签: android listview android-dialog