2012-03-14 67 views
4

在我的一項活動中,我有多個ListView控件。說清單1,清單2 & 清單3。在列表1項目的點擊,我加載數據爲列表2 & 列表3從web服務。被點擊的項目的背景被突出顯示。我通過以下選擇器實現了這一點如何在ListView的setOnItemClickListener中取消Android ListView項目的激活/高亮顯示?

<item android:drawable="@drawable/item_pressed" android:state_pressed="true"/> 
<item android:drawable="@drawable/item_focused" android:state_focused="false" 
    android:state_pressed="false" 
    android:state_selected="true"/> 
<item android:state_activated="true" android:drawable="@drawable/item_selected"/> 

正如你所看到的,我已指定機器人:state_activated =「真」改變點擊/輕按的項目的BG。這很好。

其實我想防止被選擇的項目點擊/高亮如果正在加載一些其他項目的數據...喜歡

list1.setOnItemClickListener(new OnItemClickListener() { 
      public void onItemClick(AdapterView<?> parent, View view, 
        int position, long id) { 

       // load data if no other call to web service is in progress 
       if (_isNotLoadingData) { 
        loadList2AndList3DataUsingWebService(); 
       } else { 
        //Stop This Item From selected/highlighted 
        //BUT none of the following work. .. Item is always Selected 
        view.setSelected(false); 
        //view.setActivated(false); 
        //view.setEnabled(false); 
       } 
      } 
     }); 

上面的代碼將停止多次調用被引導到我們的Web服務,但如果沒有爲該ListView項目調用Web服務,我無法停止突出顯示/激活項目。

我該如何操作?

在下午8時08分2012年3月19日編輯:沒有正確答覆可是...我堅持&等待任何幫助

+0

爲什麼要取消點擊? – 2012-03-14 10:37:40

+0

爲什麼你不只是做一個if語句到你的onItemClick方法?如果這是onItemClick函數中的第一件事,那麼它與onBeforeClick()函數基本相同... – KarlKarlsom 2012-03-14 10:57:07

+0

我已更新我的問題並已解釋。對不起,提供一個不明確的問題 – Aamir 2012-03-14 13:04:53

回答

11

我居然遇到了同樣的問題,前幾天。解決方案是而不是來設置view.setItemChecked(false),而是在.onItemClick()-方法中,調用您的列表視圖並設置listview.setItemChecked(position, false)。這爲我解決了它。

例子:

listView.setOnItemClickListener(new OnItemClickListener() { 

    @Override 
    public void onItemClick(AdapterView<?> adapterView, View view, 
      int position, long arg3) { 

     // load data if no other call to web service is in progress 
     if (_isNotLoadingData) { 
      loadList2AndList3DataUsingWebService(); 

     } else { 
      ListView lv = (ListView) adapterView; 
      lv.setItemChecked(position, false); 
     } 
    } 
}); 
+0

強硬我已經解決了一些其他工作的問題......但如果我沒有使用過這種解決方案...我會首選urs的方式...我會將你的評論標記爲答案 – Aamir 2012-03-23 12:29:13

+0

Dude感謝你的方法。無論如何,你仍然保持「選擇」行爲,只禁用「激活」的行爲? – Machado 2015-05-15 17:54:02

0

的onclick監聽器,你可以在查看通話setonclicklistener(空)內這稱爲點擊事件。這種方式將刪除自己的onclicklistener。

mTitleView.setOnClickListener(null) 
+0

謝謝..但這不是我想 – Aamir 2012-03-14 13:14:00

-1

,如果你不想處理單擊事件第一次點擊後,只需使用yourList.setOnItemClickListener(null)

+0

謝謝..但這不是我想要的 – Aamir 2012-03-14 13:13:48

+0

@AamirHabib wouldnt它是一個更好的主意,以防止您的用戶點擊其他項目(這種答案建議的方式),而不僅僅是禁用亮點?這樣,您的用戶就可以確切地知道特定的列表條目目前不可用於採取行動。 – Urban 2012-03-22 22:16:12

+0

我已經做了同樣的方式...通過禁用整個列表兩秒鐘,當一個項目被點擊的目的是網絡服務響應會在這幾秒鐘內收到......但我正在尋找類似的東西@Reinier建議...我可能是錯誤的..但那東西按我的計劃工作 – Aamir 2012-03-23 12:34:41

-1
listView.setOnItemClickListener(new OnItemClickListener() 
    { 

     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, 
       int position, long arg3) 
     { 

      //view.setEnabled(false); 
      //adapterView.setEnabled(false); 
     } 
    }); 
  1. view.setEnabled(假);如果要禁用用戶點擊過的listItem,請使用此選項。這樣可以防止該特定項目上的onclick事件。

  2. adapterView.setEnabled(false);如果你想禁用整個listView,使用這個。 它會阻止整個listView上的onclick事件。

希望這有助於

+0

謝謝你的答案..但這不起作用...我嘗試使用** view.setSelected(false)**太,但不是工作。 ...其實我想防止被點擊的項目被選中/突出顯示,如果某些其他項目的數據正在加載..我也更新了我的問題 – Aamir 2012-03-14 12:43:30

1

請在禁用適配器的項目。這將刪除所有點擊,而不必禁用項目點擊偵聽器或其他類似的黑客。

我不知道你的適配器是怎麼樣的,但通常你會覆蓋你的適配器中的一些方法。請注意,我調用方法isLocked而不是isNotLocked。使用負布爾值通常是一個不好的想法,會導致混淆,在這種情況下,您甚至不必在開始時將其設置爲false,因爲這是布爾值的默認值。

public class MyCoolAdapter extends ListAdapter { 

private boolean mIsLocked; 

public boolean areAllItemsEnabled() { 
    return false; 
} 

public abstract boolean isEnabled (int position) { 
    if (mIsLocked) { 
     return false; 
    } 
    return true; 
} 
... 
} 

如果您只想禁用特定的行,那麼您將爲這些位置返回false併爲其他位置返回true。

當您更改isLoading參數時,您將不得不通知該數據集已更改。這將導致listview重新查詢適配器。 例如:

public void setIsLoading(final boolean isLocked) { 
    mIsLocked = isLocked; 
    notifyDatasetChanged(); 
}