我发现了一个关于滚动列表视图和按钮点击的类似问题,但它对我没有帮助。我的问题是:
我有一个包含自定义行的列表视图。我有两种不同的listview状态;状态之间的切换是屏幕底部的按钮。第二个状态在每行中都有删除按钮。当我单击特定行中的删除按钮时,该行将从数据库中删除并更新列表视图。一切都很好,除了我需要两次点击删除按钮才能使它工作。以下是我处理点击的代码。 flag == 1是listview的第二个状态。
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
View main = parent.getChildAt(position);
TextView delete = (TextView)main.findViewById(R.id.delete_button);
if(flag==0){
switchToItemsView(id);
}
if(flag==1){
delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mDbHelper.deleteList(id);
updateListView();
}});
}
}
我尝试将父视图的focusableInTouchMode属性设置为false,如另一篇文章所示,但它没有帮助。
如果你能帮我解决这个问题,我将不胜感激,
提前谢谢。
答案 0 :(得分:6)
可能你有焦点。删除它。
android:focusableInTouchMode="true"
android:focusable="true"
答案 1 :(得分:2)
您需要在实际标记检查之前声明onClickListener
;在您的情况下,视图更改并使用该标志,并设置侦听器。下一次单击实际上会触发侦听器。
不相关,但您应该将第二个if
更改为elseif
,因为如果第一个被调用,则无法调用它。
答案 2 :(得分:2)
花了几个小时后,我想出了怎么做:
我将我的点击监听器从我的主活动类移动到我的自定义ListAdapter类,并将其修改为如下所示;
deleteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int rowid = Integer.parseInt(rowIds.get(position));
mDb.deleteList(rowid);
lists.remove(position);
notifyDataSetChanged();
}
});
现在效果很好。当我单击“删除”按钮时,它会从ArrayList(ListAdapter中使用的列表)和数据库中删除列表。