2016-07-25 47 views
1

我做了SO搜索,但並不真正知道要查找什麼。非常抱歉,如果這是一個愚蠢的問題。我剛剛接觸android編程,並試圖用listview製作可穿戴應用程序。當用戶點擊一個項目時,它應該顯示一個延遲的確認視圖,允許用戶取消選擇。我有一個有兩個視圖的活動,一個ListView和一個DelayedConfirmationView。ListView onItemClick和DelayedConfirmationView onTimerSelected觸發同樣的點擊

單擊列表項時,啓動計時器並顯示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(真)
d/AddClimbActivity:onItemClick
d/AddClimbActivity: setListViewVisible(假)
d/AddClimbActivity:onTimerSelected < - 按下取消按鈕
d/AddClimbActivity:setListViewVisible(真)
d/AddClimbActivity:onItemClick < - 意外行爲
d/AddClimbActivity:setListViewVisible(假)
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/Add ClimbActivity:setListViewVisible(真)
d/AddClimbActivity:onItemClick
d/AddClimbActivity:setListViewVisible(假)
d/AddClimbActivity:onTimerSelected
d/AddClimbActivity:onTimerSelected出口
d/AddClimbActivity:setListViewVisible(真)
d/AddClimbActivity:onTimerFinished < - 意外行爲

所以通過將延遲我得到一些意想不到的行爲,其中既onTimerSelected和onTimerFinshed回調被調用。

+0

而不是使用onItemClickListener,執行你的適配器內的點擊事件,如果你在你的ListView –

+0

@vikramthakur不確定的因素點擊一個以上的觀點你是什​​麼意思。我在listview的每個元素中只有一個視圖,我使用simple_list_item_1和一個textview。 – grantka

+0

你可以請檢查'onItemClick'被調用是你評論'setListViewVisible(true);'在'onTimerSelected'回調?謝謝。 –

回答

0

我最終不得不添加兩件事才能使其工作。我不得不延遲視圖切換(請參閱我的文章中的編輯)以及將延遲的確認視圖偵聽器設置爲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); 
}