我做了SO搜索,但实际上并不知道要寻找什么。很抱歉,如果这是一个愚蠢的问题。我是android编程的新手,我正在尝试使用listview创建一个可穿戴的应用程序。当用户单击某个项目时,它应显示一个允许用户取消选择的延迟确认视图。我有一个带有两个视图的活动,一个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&lt; - 按下取消按钮
D / AddClimbActivity:setListViewVisible(true)
D / AddClimbActivity:onItemClick&lt; - 意想不到的行为
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退出
D / AddClimbActivity:setListViewVisible(true)
D / AddClimbActivity:onTimerFinished&lt; - 意想不到的行为
因此,通过添加延迟,我会在调用onTimerSelected和onTimerFinshed回调时出现一些意外行为。
答案 0 :(得分:0)
我最终不得不添加两件事来让它发挥作用。我不得不延迟视图切换(请参阅我的帖子中的编辑)以及将延迟确认视图侦听器设置为null,因此onTimerFinished没有被调用。在默认情况下选择安卓时,安卓无法取消计时器,这似乎很奇怪,但也许有一个用例让用户按下按钮而没有停止计时器?
无论如何,这是我的代码最终的结果:
@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);
}