2013-02-11 75 views
0

我在我的項目中有一個ListView。它有很多元素,並且它使用自定義適配器,因爲它從軌道服務器動態填充。ListView OnLongClick奇怪的行爲

我想在項目長壓時更改ListItem的內容。爲了實現這個目標,我在ListItem中有兩個佈局,一個可見,一個隱藏。

問題是,當我長按項目時,佈局會發生變化(如預期的那樣),但其他ListItems也會受到影響,並以相同的方式進行更改。這似乎每5個項目發生一次,我不知道爲什麼。

這是我使用的LongClickListener,它位於德GetView方法中的自定義適配器上:

View v = convertView; 

if (v == null){ 
    LayoutInflater vi = 
     (LayoutInflater)getActivity().getSystemService(
     Context.LAYOUT_INFLATER_SERVICE); 
    v = vi.inflate(R.layout.list_item, null); 
} 

final LinearLayout placeInfo = 
    (LinearLayout) v.findViewById(R.id.list_item_info); 

final RelativeLayout placeBrief = 
    (RelativeLayout)v.findViewById(R.id.list_item_brief); 

v.setOnLongClickListener(new OnLongClickListener(){ 

    @Override public boolean onLongClick(View v) { 
     placeInfo.setVisibility(View.GONE); 
     placeBrief.setVisibility(View.VISIBLE); 
     return false; 
    }}); 

我希望得到任何幫助,非常感謝提前。

+1

你打算長時間點擊整個列表視圖還是單個項目,如果是這樣,你應該使用'setOnItemLongClick()'來代替。 – draksia 2013-02-11 21:00:03

+0

我試過了,但是我無法讓它工作。不過,我這樣做的方式改變了佈局。它的副作用(佈局更改影響多於1個ListItem),我無法解決。 – Sebiwi 2013-02-11 21:03:44

+0

所以我想你試圖做的是當你的列表視圖中的一個項目被長時間點擊,你不想再顯示該列表中的項目? 如果是這種情況,我可以儘快寫點東西。 – draksia 2013-02-11 22:19:39

回答

0

ListViews recycle Views,所以你只有幾個視圖的所有項目。您直接更改這些視圖實例之一以在信息|摘要之間切換。您需要的是將受影響位置的信息簡介標誌的狀態保存在其他地方(例如,在適配器中應該是「摘要」的位置列表)。這樣,當你回到getView()時,你可以顯示正確的。

+0

我理解這個概念。然而,我應該如何根據列表在getView()內部顯示de右邊的一個?我無法想象它。 – Sebiwi 2013-02-11 21:31:25

+1

最簡單的(也不是最有效的方法)就是隻有一個布爾值數組,它的大小與列表的大小相同,其值應該顯示爲簡短的「真實」值。但是你並不需要那麼多,只是一個包含你想要的索引的集合('brief = set.contains(position)')。 – dmon 2013-02-11 22:02:25

+0

完美,非常感謝! – Sebiwi 2013-02-12 13:32:06