ListView onItemClick 和 DelayedConfirmationView onTimerSelected 通过相同的点击触发
ListView onItemClick and DelayedConfirmationView onTimerSelected triggered with same click
我进行了 SO 搜索,但真的不知道要查找什么。很抱歉,如果这是一个愚蠢的问题。我是 android 编程的新手,我正在尝试制作一个带有列表视图的可穿戴应用程序。当用户点击一个项目时,它应该显示一个允许用户取消选择的延迟确认视图。我有一个带有两个视图的 activity,一个 ListView 和一个 DelayedConfirmationView。
单击列表项时,将启动计时器并显示 delayedConfirmationView。
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
mSelectedPosition = position;
setListViewVisible(false);
// Two seconds to cancel the action
mDelayedView.setTotalTimeMs(2000);
// Start the timer
mDelayedView.start();
}
我是这样在两种视图之间切换的:
private void setListViewVisible(boolean listViewVisible) {
if(listViewVisible){
mListView.setVisibility(View.VISIBLE);
mDelayedView.setVisibility(View.GONE);
}else{
mListView.setVisibility(View.GONE);
mDelayedView.setVisibility(View.VISIBLE);
}
}
如果按下取消按钮,我会切换回列表视图,以便用户可以修改他们的选择:
@Override
public void onTimerSelected(View view) {
// cancel selected, so go back to listview
setListViewVisible(true);
}
我遇到的问题是,当我点击取消按钮时,它还会触发列表视图的 onItemClickListener,因此它会立即转回延迟确认视图。
我觉得答案应该很简单,但令我感到奇怪的是,同一个点击同时触发了 onTimerSelected 和 onItemClick。
编辑:
我尝试在切换视图之前添加延迟以查看视图转换是否太快并按下按钮。
这是添加延迟之前的日志:
D/AddClimbActivity: onCreate()
D/AddClimbActivity: setListViewVisible(true)
D/AddClimbActivity: onItemClick
D/AddClimbActivity: setListViewVisible(false)
D/AddClimbActivity: onTimerSelected <-- PRESSING THE CANCEL BUTTON
D/AddClimbActivity: setListViewVisible(true)
D/AddClimbActivity: onItemClick <-- UNEXPECTED BEHAVIOR
D/AddClimbActivity: setListViewVisible(false)
D/AddClimbActivity: onTimerFinished
新 onTimerSelected:
@Override
public void onTimerSelected(View view) {
Log.d(TAG, "onTimerSelected");
// cancel selected, so go back to listview
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
setListViewVisible(true);
}
}, 50);
Log.d(TAG, "onTimerSelected exit");
}
以及新日志:
D/AddClimbActivity: onCreate()
D/AddClimbActivity: setListViewVisible(true)
D/AddClimbActivity: onItemClick
D/AddClimbActivity: setListViewVisible(false)
D/AddClimbActivity: onTimerSelected
D/AddClimbActivity: onTimerSelected exit
D/AddClimbActivity: setListViewVisible(true)
D/AddClimbActivity: onTimerFinished <-- UNEXPECTED BEHAVIOR
因此,通过添加延迟,我得到了一些意外行为,其中调用了 onTimerSelected 和 onTimerFinshed 回调。
我最后不得不添加两件事来让它工作。我不得不延迟视图切换(请参阅我的 post 中的编辑)以及将延迟确认视图侦听器设置为 null,这样就不会调用 onTimerFinished。 android 默认情况下不会取消计时器,这似乎很奇怪,但也许有一个用例让用户按下按钮而不停止计时器?
无论如何,我的代码最终是这样的:
@Override
public void onTimerSelected(View view) {
Log.d(TAG, "onTimerSelected");
mDelayedView.setPressed(true);
// Prevent onTimerFinished from being heard.
mDelayedView.setListener(null);
// cancel selected, so go back to listview
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
setListViewVisible(true);
}
}, 50);
}
我进行了 SO 搜索,但真的不知道要查找什么。很抱歉,如果这是一个愚蠢的问题。我是 android 编程的新手,我正在尝试制作一个带有列表视图的可穿戴应用程序。当用户点击一个项目时,它应该显示一个允许用户取消选择的延迟确认视图。我有一个带有两个视图的 activity,一个 ListView 和一个 DelayedConfirmationView。
单击列表项时,将启动计时器并显示 delayedConfirmationView。
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
mSelectedPosition = position;
setListViewVisible(false);
// Two seconds to cancel the action
mDelayedView.setTotalTimeMs(2000);
// Start the timer
mDelayedView.start();
}
我是这样在两种视图之间切换的:
private void setListViewVisible(boolean listViewVisible) {
if(listViewVisible){
mListView.setVisibility(View.VISIBLE);
mDelayedView.setVisibility(View.GONE);
}else{
mListView.setVisibility(View.GONE);
mDelayedView.setVisibility(View.VISIBLE);
}
}
如果按下取消按钮,我会切换回列表视图,以便用户可以修改他们的选择:
@Override
public void onTimerSelected(View view) {
// cancel selected, so go back to listview
setListViewVisible(true);
}
我遇到的问题是,当我点击取消按钮时,它还会触发列表视图的 onItemClickListener,因此它会立即转回延迟确认视图。
我觉得答案应该很简单,但令我感到奇怪的是,同一个点击同时触发了 onTimerSelected 和 onItemClick。
编辑: 我尝试在切换视图之前添加延迟以查看视图转换是否太快并按下按钮。
这是添加延迟之前的日志:
D/AddClimbActivity: onCreate()
D/AddClimbActivity: setListViewVisible(true)
D/AddClimbActivity: onItemClick
D/AddClimbActivity: setListViewVisible(false)
D/AddClimbActivity: onTimerSelected <-- PRESSING THE CANCEL BUTTON
D/AddClimbActivity: setListViewVisible(true)
D/AddClimbActivity: onItemClick <-- UNEXPECTED BEHAVIOR
D/AddClimbActivity: setListViewVisible(false)
D/AddClimbActivity: onTimerFinished
新 onTimerSelected:
@Override
public void onTimerSelected(View view) {
Log.d(TAG, "onTimerSelected");
// cancel selected, so go back to listview
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
setListViewVisible(true);
}
}, 50);
Log.d(TAG, "onTimerSelected exit");
}
以及新日志:
D/AddClimbActivity: onCreate()
D/AddClimbActivity: setListViewVisible(true)
D/AddClimbActivity: onItemClick
D/AddClimbActivity: setListViewVisible(false)
D/AddClimbActivity: onTimerSelected
D/AddClimbActivity: onTimerSelected exit
D/AddClimbActivity: setListViewVisible(true)
D/AddClimbActivity: onTimerFinished <-- UNEXPECTED BEHAVIOR
因此,通过添加延迟,我得到了一些意外行为,其中调用了 onTimerSelected 和 onTimerFinshed 回调。
我最后不得不添加两件事来让它工作。我不得不延迟视图切换(请参阅我的 post 中的编辑)以及将延迟确认视图侦听器设置为 null,这样就不会调用 onTimerFinished。 android 默认情况下不会取消计时器,这似乎很奇怪,但也许有一个用例让用户按下按钮而不停止计时器?
无论如何,我的代码最终是这样的:
@Override
public void onTimerSelected(View view) {
Log.d(TAG, "onTimerSelected");
mDelayedView.setPressed(true);
// Prevent onTimerFinished from being heard.
mDelayedView.setListener(null);
// cancel selected, so go back to listview
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
setListViewVisible(true);
}
}, 50);
}