2011-11-16 20 views
1

我有一個ListActivity使用自定義ArrayAdapter工作一個奇怪的問題定義適配器按鈕的點擊。 列表項通過定製的getView綁定到數據,並且包含幾個文本視圖和一個按鈕。 當點擊該項目的按鈕,我打開一個新的活動根據按鈕按下標籤,其中包含數據項目ID。問題與ListActivity

事情是, 有時點擊某個項目的按鈕實際上會執行點擊其他項目的點擊,或者看起來像這樣。 這真的很奇怪,它表現得好像我點擊的按鈕失去了焦點,而是被點擊了。 當使用標準按鈕其實我可以看到有某種混亂爲重點,從一個跳到另一個列表按鈕。

我還沒有想出的情景,但我懷疑這是某種方式與在後臺的多次調用getView。

這是我的適配器的getView實現:

public View getView(int position, View convertView, ViewGroup parent) 
{ 
    View v = convertView; 
    Context context = App.getContext(); 
    if (v == null) 
    { 
     // if the view is empty, init 
     v = mInflater.inflate(R.layout.list_item, null); 

     // add click listener to the item button 
     Button b = (Button)v.findViewById(R.id.b); 
     OnClickListener lsn = new OnClickListener() 
     { 
      @Override 
      public void onClick(View view) 
      { 
       // when clicked we want to open the new activity with the selected id 
       int id = Integer.parseInt(view.getTag().toString()); 
       Intent i = new Intent(mActivityContext, otherActivity.class); 
       i.putExtra("ID", id); 

       mActivityContext.startActivity(i); 
      } 
     }; 

     b.setOnClickListener(lsn); 
    } 

    ItemData currItem = m_Items.get(position); 

    // Some fields data bindings to currItem 

    Button btn = (Button)v.findViewById(R.id.b); 
    btn.setEnabled(currItem.isButtonEnabled); 
    btn.setTag(currItem.getID()); 

    return v; 
} 

這是我的名單上定義的佈局:

<ListView android:layout_width="fill_parent" android:id="@+id/android:list" 
      android:fadingEdge="none" android:divider="@color/transparent" android:dividerHeight="2dp" 
      android:background="@color/transparent" android:focusable="false" 
      android:cacheColorHint="@color/transparent" android:layout_height="fill_parent"></ListView> 

有什麼想法? 謝謝!


重要更新:

一些測試,我注意到,有什麼項目是越來越錯誤地點擊一些一致性之後。它始終是鏡子項目。即當點擊列表中的第一個項目時,當我收到其他項目時,它總是最後一個!

e.g如果在列表中的3項,第一個和最後一個有時稱呼對方,但從來沒有中間項,如預期的中間項目始終工作。 好像某處有另一個列表的項目反向順序,有時我得到鏡像索引,而不是常規和可見的一個...

這真的很奇怪!我很可能在做一些非常錯誤的事情,但我無法想象會發生這種情況。

我已經轉換陣列適配器的一類擴展baseAdapter用的ArrayList但行爲繼續...

最後更新... 所以我發現了這個問題,只有當發生notifyDatasetChanged正在後臺運行。但是我只能每2秒減少一次呼叫。這導致的問題是很難趕上,但它仍然存在...

任何線索?

+0

在對陣列中的對象列表進行任何更改後,問題是否存在?如果是這樣,你刷新listView? – Wizetux

+0

我最困惑的事實是有兩個引用的按鈕。會觸發click事件的按鈕(由R.id.b引用)與貼有標籤的按鈕不同(由R.id.button引用)。我沒有看到活動是如何以正確的id值開始的! – Devunwired

+0

你可以添加ListActivity的完整代碼嗎?問題可能在於如何調用getView方法/ setup。 – Bryan

回答

0

我想知道如果這個問題是在你的OnClick功能。是你從OnClick定義中定義的'v'獲取標籤的「v」,還是基於範圍,它是你在getView函數的第一行定義的v?嘗試將變量名更改爲編譯器更清晰的內容,並查看是否遇到同樣的問題。

+0

好吧,對。我認爲,因爲它應該是一個不同的範圍,這並不重要。但我已經改變了它。問題仍然存在... – Shlomi

0

我同意Wizetux關於使用更好的變量名稱爲您的convertView變量,使用的東西,而不是'V'。然而,我也認爲,而不是重寫視圖的onclick,你可以調用或使用你正在擴展的ListActivity類的onListItemClick(假設你的代碼是在擴展ListActivity的類中)?

+0

以及onClick實際上是按鈕點擊事件,我想要按下,而不是整個項目按。你認爲這應該是一個問題? – Shlomi

+0

不,從按鈕中,您仍然應該能夠確定按鈕處於哪個列表項或列表元素。如果您更改第一個'v'變量的名稱,該名稱是通過傳入的convertView變量設置的,那麼將更容易排除故障並調試正在進行的操作。 – Bryan

+0

我仍在研究這一點。這是一個棘手的問題。出於某種原因,從你所說的話,只有有時錯誤的身份證被傳遞到意圖。對於哪個按鈕的onClick被觸發,似乎存在一些混淆的問題......一個問題是何時將錯誤的ID傳遞給意圖附加組件,哪個按鈕是該ID? – Bryan

0

您應該直接定義onClickListener,因爲它是在同一個方法中聲明和定義的。

而且,我不知道該按鈕定義和onClickListener的按鈕應該的條件裏面「如果(V = NULL)」 ...的直接定義onClickListener而不是使用可變

例子:

按鈕b =(按鈕)v.findViewById(R.id.b);

b.setOnClickListener(新OnClickListener(){ @覆蓋公共無效的onClick(視圖v){// 所述的onClick代碼 } });

+0

我已經將偵聽器移到了v = null部分之外,並且還直接定義了onClick偵聽器。沒有改變... – Shlomi

+0

你使用eclipse調試器運行了程序嗎?如果沒有,可能有助於在按鈕b按鈕的按鈕上放置一個斷點。發佈按鈕標籤的值,視圖位置是什麼,列表元素的位置以及任何其他變量值是您認爲可能有用的。我們將繼續幫助您解決這個複雜的問題。 – Bryan

+0

我確實在使用eclipse和日誌記錄信息進行調試。目前我已將觸摸和焦點事件添加到按鈕。 焦點事件永遠不會觸發,但觸摸事件確實會觸發。 我現在可以看到,點擊按鈕時,觸摸事件通常會被觸發兩次,大部分時間使用相同的視圖標記,但通常其中一個是錯誤標記,另一個列表項。觸發事件觸發後,我可以看到點擊事件,並且在其中,有時即使兩個事先觸摸事件獲得相同的正確標記,點擊事件也會得到錯誤的事件! 我真的很感謝幫助! – Shlomi