2011-11-02 37 views
3

我已經實現了gallery和listview。 畫廊有圖像,當我點擊圖像使用setOnItemSelectedListener Listview更新,其中有關於圖像選擇的信息。Android圖庫視圖監聽器添加延遲?

問題:當我快速滾動畫廊時,它會迅速更新我的列表視圖。但據我所知,listview應該等待圖庫停止移動任何一個圖像,然後更新其內容。

任何人都知道如何做或在更新listview之間添加時間?請幫忙..

回答

3

你可以嘗試setOnItemClickListener來代替。只有在實際「點擊」圖像時纔會觸發它,而不僅僅是選擇它。

gallery.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View v, int position, long id) { 
      // Do what you want 
     } 
    }); 

更新:

如果你想延遲一個動作,而不是onItemClickListener實現,你有(至少)兩種選擇。一種是使用超時(Thread.sleep())運行單獨的線程,在完成之後,您可以使用Handler來更新您的活動狀態。另一個選擇是使用AsyncTask,這在技術上是相同的方法,它只將Runnable任務和Handler包裝在一個內部類中。最簡單的實現可能是這樣的:

ListUpdater listUpdater; 

@Override 
public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long arg3) { 

    // We have to run this thread to add delay before updating activity views 
    if (listUpdater != null) { // Cancel previous task 
     listUpdater.cancel(true); 
    } 
    if (listUpdater == null || position != listUpdater.getPosition()) { 
     listUpdater = null; 
     listUpdater = new ListUpdater(position); 

     listUpdater.execute(); 
    } 
} 

class ListUpdater extends AsyncTask<String, String, String> { 
    private int position; 

    public int getPosition() { 
     return position; 
    } 

    public ListUpdater(int position) { 
     this.position = position; 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     try { 
      Thread.sleep(600); // set delay time here 
     } catch (InterruptedException e) { 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     if (!isCancelled()) { 
      // If another thread is not running, 
      // that is if another item was not selected, 
      // update the activity 

      // Add code here to update the activity 
      // This method works in UI Thread, so you don't need to use Handler 
      // For example: 
      Toast.makeText(YourActivity.this, "" + position, Toast.LENGTH_SHORT).show(); 
     } 
     super.onPostExecute(result); 
    } 
} 

這是一個實現延遲的例子。沒有必要精確地滿足您的需求,但是您可以從中獲得一些如何實現的想法。

+0

我的應用程序需要的是,當圖像被選中(而不是點擊)它會自動更新列表視圖(如android中的壁紙選擇)。此外它現在正在做喜歡壁紙選擇。但我只是希望它應該在更新listview之前等待1秒(如它在android中的壁紙選擇中等待) – rohit

+0

請檢查我所做的更新。 – morphium

+0

我會嘗試一下,並讓你知道..謝謝你:) – rohit

0

無需實現setOnItemSelectedListener的,實行OnItemClickListener:

Gallery g = (Gallery) findViewById(R.id.gallery); 
     g.setAdapter(new ImageAdapter(this)); 

     g.setOnItemClickListener(new OnItemClickListener() { 
      public void onItemClick(AdapterView<?> parent, View v, int position, long id) { 
       Toast.makeText(HelloGallery.this, "" + position, Toast.LENGTH_SHORT).show(); 
      } 
     }); 
+0

onItemClickListener不符合我的應用程序需求..而滾動畫廊圖像時,它應該自動更新列表視圖。而不是通過點擊圖片。但它應該等待(可能是1秒),然後不立即更新列表視圖。 – rohit

0

得到參照使用的AsyncTask morphium的解決方案後,我的工作,但是,我發現有多個來電者的問題(例如:OnHierachyChangeListener和OnItemSelectedListener)。第二個調用者將取消第一個任務,並且如果他們保持相同的位置,則不會啓動新任務,導致第一個更新任務失敗。

它與

  1. 一個畫廊的作品很好地BaseAdapter
  2. 內BaseAdapter
  3. 過濾器(搜索項)
  4. OnHierachyChangeListener(添加/由過濾器類項目的刪除)
  5. OnItemSelectedListener(用戶操作)

這是我的代碼版本

@Override 
public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long arg3) { 

    // We have to run this thread to add delay before updating activity views 
    if (listUpdater != null) { // Cancel previous task 
     listUpdater.cancel(true); 
    } 
    listUpdater = new ListUpdater(position); 
    listUpdater.execute(); 
} 

我的代碼只是停止前面的任務,並開始一個新的,無論前一個和當前的位置。爲了安全起見,你也可以使它成爲一個同步方法