2011-07-12 63 views
5

我花了兩天時間試圖排序此問題。如果任何人能夠幫助,我會大力讚賞。自定義列表查看與每個行中的兩個按鈕

我想要實現:

有一個ListView,因此玩家可以通過文本字段(玩家名)添加新條目(播放器),然後提交按鈕。在ListView的每個字段中,我顯示玩家名稱,然後顯示兩個ImageButton。一個帶有男性符號,另一個帶有女性符號。男性符號默認被切換,並且用戶可以通過切換男性按鈕或女性按鈕來將玩家設置爲男性或女性。最後,一旦用戶移動到下一個屏幕(新活動),應用程序將把玩家姓名和附加性保存到某種形式的存儲中,並繼續下一個活動。

我所取得的成就:

我有一個簡單的數組適配器,它在玩家添加新的球員姓名的名單,我在其上運行的notifyDataSetChanged()。該適配器也被設置爲使用自定義行佈局文件。裏面的佈局文件,它看起來像這樣:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" android:layout_height="wrap_content"> 
    <RelativeLayout android:layout_height="wrap_content" 
     android:layout_width="fill_parent" android:id="@+id/relativeLayout1" android:layout_marginTop="5dp"> 
     <TextView android:layout_width="wrap_content" 
      android:layout_height="wrap_content" android:id="@+id/playerName" 
      android:layout_centerVertical="true" android:text="Derp" android:textStyle="bold" android:layout_marginLeft="5dp" android:textSize="22dp" android:textColor="@color/male_blue"></TextView> 
     <ImageButton android:layout_height="60dp" 
      android:layout_width="60dp" android:onClick="maleClickHandler" 
      android:src="@drawable/male_icon_settings" android:id="@+id/buttonA" android:layout_alignParentRight="true" android:layout_marginRight="65dp"></ImageButton> 
     <ImageButton android:onClick="femaleClickHandler" 
      android:layout_height="60dp" android:layout_width="60dp" android:id="@+id/buttonB" 
      android:layout_alignParentRight="true" android:layout_marginRight="5dp" android:src="@drawable/female_icon_settings"></ImageButton> 
    </RelativeLayout> 
</LinearLayout> 

每行參考類文件方法的兩個按鈕。這裏是我的這段代碼:

public void maleClickHandler(View v) { 

     RelativeLayout vwParentRow = (RelativeLayout) v.getParent(); 
     ImageButton maleButton = (ImageButton) vwParentRow.getChildAt(1); 
     maleButton.setImageDrawable(getResources().getDrawable(
       R.drawable.male_icon_selected)); 
     vwParentRow.refreshDrawableState(); 
    } 

    public void femaleClickHandler(View v) { 

     RelativeLayout vwParentRow = (RelativeLayout) v.getParent(); 
     ImageButton femaleButton = (ImageButton) vwParentRow.getChildAt(2); 
     femaleButton.setImageDrawable(getResources().getDrawable(
       R.drawable.female_icon_selected)); 
     vwParentRow.refreshDrawableState(); 
    } 

我還沒有實現這兩個按鈕之間的相互連接,只允許一個被激活的時間,或者甚至untoggle之一,因爲我覺得我可能會完全採取錯誤的做法。

問題:

在添加新條目列表中,切換一個和/或其他男/女按鈕,事情就真的越野車,和男/女切換圖標可能會移動因爲它應該連同附加的玩家字符串,或者更有可能的是,那些切換的將保持在第一行(列表的陣列位置0),或者甚至移動到第二個列表位置,並且將它們自己複製到切換到行上以上。

如何幫助...?

我重視我下面的屏幕的圖像,從仿真器,以幫助說明我的觀點 Screenshot!

我認爲我可能需要使用某種形式的自定義適配器的;我在這個問題上做了很多的研究,但是我找不到與我想要達成的目標相關的任何事情,所以如果你能指出我正確的方向,甚至可以嘗試將最基本的解決方案放在一起問題類型,我將非常感激。

最後,當我得到這個工作時,哪種存儲形式最適合存儲玩家名字和他們的性別?我希望用戶能夠在退出應用程序並重新啓動後保留播放列表。

感謝您的幫助! :)

回答

1

您將需要使用自定義適配器,它本身應該能夠跟蹤每個條目的男性/女性標誌。

由於按鈕的狀態由適配器的getView方法管理,因此您的方法將不起作用。即使你通過挖掘孩子來改變它們,下一次調用getView方法時,它會弄亂事情。

+0

謝謝,我懷疑我不得不按照這些方法做些事情;感謝你澄清這個美麗的:) –

1

很多這取決於你期望在你的遊戲中有多少玩家。如果這個數字可能適合一個屏幕(或非常接近它),那麼ListView實際上是不必要的。和適配器並不是一個真正的便利方法,它們是提高性能的工具。它們只會記憶屏幕上的內容,並在滾動時回收舊行,已顯示的新行的View,這就是爲什麼一些按鈕狀態被複制到不同的行。

有幾個方法,你可以解決這個問題:

  • 你可以寫一個自定義適配器自己作爲庫馬爾Bibek建議。在此適配器中,您希望覆蓋getView()方法,以確保每次調用該方法時每個按鈕都具有正確的狀態。

  • 如果您沒有足夠的數據來保證使用ListView,那麼您也可以簡單地使用填充了少數行的ScrollView手動填充。這樣你就不用擔心你的行被回收了,而按鈕狀態也沒有了。

此外,你可能要考慮使用RadioGroup的性別選擇(因爲它們是由相互排斥我想不出單選按鈕更好用的)。

此外,行XML文件中的外部LinearLayout看起來沒有必要。

就存儲而言,您可以使用SQLite數據庫或SharedPreferencesSharedPreferences不需要安裝,但我覺得像SQLite數據庫更適合您的需求。

+0

非常感謝你,我想我會用無線電組和你的ScrollView來建議你的建議。謝謝一堆! :D –

+0

非常歡迎。當您收到滿足您的答案時,您應該始終點擊旁邊的空白複選標記將其標記爲正確答案。一旦您提出了幾個問題,您的「接受百分比」就會顯示在您的用戶徽章中,並且很高的百分比會鼓勵其他人向您提供高質量的答案。 :) –