单击

时间:2016-07-25 05:52:50

标签: android android-layout listview wear-os

我做了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回调时出现一些意外行为。

1 个答案:

答案 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);
}