2013-05-10 38 views
0

所以我想構建和android應用程序,它從用戶輸入代碼,並將其放入一個自定義佈局的ListView。問題與adapterview和addview

下面是佈局我對列表中的每個元素的XML(以下稱爲game_row.xml)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/dateout" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:text="Medium Text" 
     android:textAppearance="?android:attr/textAppearanceMedium" /> 

    <TextView 
     android:id="@+id/team1out" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_below="@+id/dateout" 
     android:text="Large Text" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 

    <TextView 
     android:id="@+id/team2out" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_below="@+id/team1out" 
     android:text="Large Text" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 

    <TextView 
     android:id="@+id/score1out" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_above="@+id/team2out" 
     android:layout_alignParentRight="true" 
     android:text="Medium Text" 
     android:textAppearance="?android:attr/textAppearanceMedium" /> 

    <TextView 
     android:id="@+id/score2out" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBottom="@+id/team2out" 
     android:layout_alignParentRight="true" 
     android:text="Medium Text" 
     android:textAppearance="?android:attr/textAppearanceMedium" /> 
    <View 
    android:layout_width="fill_parent" 
    android:layout_below="@+id/team2out" 
    android:layout_height="1dp" 
    android:background="@android:color/white"/> 

    </RelativeLayout> 

這裏是我的類的Java代碼:

public class KeepScoreHomeScreen extends Activity { 

    ArrayList<Game> Game_data = new ArrayList<Game>(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.home_screen); 

     if (savedInstanceState != null) { 
      System.out.println("this shouldnt happen"); 
      ArrayList<Game> inp = (ArrayList<Game>) savedInstanceState.get("games"); 
      System.out.println("game made"); 
      Game_data.addAll(inp); 

     } 
     // System.out.println("helo"); 
     // Game_data.add(new Game(1,2,3,4,3, "t","T")); 

     GameAdapter adapter = new GameAdapter(this, R.layout.game_row, Game_data); 

     // This is used to update the maximum number of days in a month 

     Bundle extras = getIntent().getExtras(); 

     ListView gameList = (ListView) findViewById(R.id.main_list_view); 
     gameList.setAdapter(adapter); 
    } 

    @Override 
    public void onSaveInstanceState(Bundle savedInstanceState) { 
     super.onSaveInstanceState(savedInstanceState); 
     savedInstanceState.putParcelableArrayList("games", Game_data); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.activity_home_menu, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 

     // Handle item selection 
     switch (item.getItemId()) { 
     case R.id.action_newEntry: 
      toNewEntry(this.findViewById(R.layout.home_screen)); 
      break; 
     case R.id.action_help: 
      buildHelp(this.findViewById(R.layout.home_screen)); 
      break; 
     case R.id.action_settings: 
      buildSettings(this.findViewById(R.layout.home_screen)); 
     default: 
      return super.onOptionsItemSelected(item); 
     } 
     return false; 
    } 

    public void toNewEntry(View view) { 
     Intent intent = new Intent(this, KeepScoreActivity.class); 
     startActivityForResult(intent, 1); 
    } 

    protected void onActivityResult(int r, int j, Intent intent) { 
     // System.out.println("hedslo"); 
     Bundle bundle = intent.getBundleExtra("myfirstintent"); 
     int sc1 = bundle.getInt("score1"); 
     int sc2 = bundle.getInt("score2"); 
     int ye = bundle.getInt("year"); 
     int mo = bundle.getInt("month"); 
     int da = bundle.getInt("day"); 
     String te1 = bundle.getString("team1"); 
     String te2 = bundle.getString("team2"); 
     Game g = new Game(sc1, sc2, ye, mo, da, te1, te2); 
     Game_data.add(g); 
     GameAdapter adapter = new GameAdapter(this, R.layout.game_row, Game_data); 
     ListView gameList = (ListView) findViewById(R.id.main_list_view); 
     gameList.setAdapter(adapter); 
    } 

    public void buildHelp(View view) { 
     /*** 
     * this code to build an alert dialog was taken from 
     * http://stackoverflow 
     * .com/questions/2795300/how-to-implement-a-custom-alertdialog-view 
     * 
     * I used this code because it allowed me to insert a simple xml file as 
     * my alertdialog 
     * 
     */ 

     LayoutInflater inflater = getLayoutInflater(); 
     View dialoglayout = inflater.inflate(R.layout.help_layout, (ViewGroup) getCurrentFocus()); 
     AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     builder.setView(dialoglayout); 
     builder.show(); 
    } 

    public void buildSettings(View view) { 
     LayoutInflater inflater = getLayoutInflater(); 
     View dialoglayout = inflater.inflate(R.layout.settings_layout, (ViewGroup) getCurrentFocus()); 
     AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     builder.setView(dialoglayout); 
     builder.show(); 

    } 
} 

我的問題是,每次我設法創建game_row輸出,然後嘗試膨脹設置欄時,我得到hte跟着錯誤

05-10 14:27:56.153: E/AndroidRuntime(1569): FATAL EXCEPTION: main 
05-10 14:27:56.153: E/AndroidRuntime(1569): java.lang.UnsupportedOperationException: addView(View, LayoutParams) is not supported in AdapterView 
05-10 14:27:56.153: E/AndroidRuntime(1569):  at android.widget.AdapterView.addView(AdapterView.java:477) 
05-10 14:27:56.153: E/AndroidRuntime(1569):  at android.view.LayoutInflater.inflate(LayoutInflater.java:497) 
05-10 14:27:56.153: E/AndroidRuntime(1569):  at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 
05-10 14:27:56.153: E/AndroidRuntime(1569):  at android.view.LayoutInflater.inflate(LayoutInflater.java:352) 
05-10 14:27:56.153: E/AndroidRuntime(1569):  at edu.ucsb.cs.cs185.hw4skeleton.KeepScoreHomeScreen.buildSettings(KeepScoreHomeScreen.java:145) 
05-10 14:27:56.153: E/AndroidRuntime(1569):  at edu.ucsb.cs.cs185.hw4skeleton.KeepScoreHomeScreen.onOptionsItemSelected(KeepScoreHomeScreen.java:91) 
05-10 14:27:56.153: E/AndroidRuntime(1569):  at android.app.Activity.onMenuItemSelected(Activity.java:2534) 
05-10 14:27:56.153: E/AndroidRuntime(1569):  at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:958) 
05-10 14:27:56.153: E/AndroidRuntime(1569):  at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:735) 
05-10 14:27:56.153: E/AndroidRuntime(1569):  at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:149) 
05-10 14:27:56.153: E/AndroidRuntime(1569):  at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874) 
05-10 14:27:56.153: E/AndroidRuntime(1569):  at com.android.internal.view.menu.ActionMenuView.invokeItem(ActionMenuView.java:514) 
05-10 14:27:56.153: E/AndroidRuntime(1569):  at com.android.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:99) 
05-10 14:27:56.153: E/AndroidRuntime(1569):  at android.view.View.performClick(View.java:4084) 
05-10 14:27:56.153: E/AndroidRuntime(1569):  at android.view.View$PerformClick.run(View.java:16966) 
05-10 14:27:56.153: E/AndroidRuntime(1569):  at android.os.Handler.handleCallback(Handler.java:615) 
05-10 14:27:56.153: E/AndroidRuntime(1569):  at android.os.Handler.dispatchMessage(Handler.java:92) 
05-10 14:27:56.153: E/AndroidRuntime(1569):  at android.os.Looper.loop(Looper.java:137) 
05-10 14:27:56.153: E/AndroidRuntime(1569):  at android.app.ActivityThread.main(ActivityThread.java:4745) 
05-10 14:27:56.153: E/AndroidRuntime(1569):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-10 14:27:56.153: E/AndroidRuntime(1569):  at java.lang.reflect.Method.invoke(Method.java:511) 
05-10 14:27:56.153: E/AndroidRuntime(1569):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
05-10 14:27:56.153: E/AndroidRuntime(1569):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 

任何人都可以請幫我弄清楚如何讓我的觀點與彼此很好地發揮?

+0

您試圖膨脹的'View'不是'AdapterView'支持的。你有沒有嘗試過使用不同類型的'View'? – Codeman 2013-05-10 21:41:37

+0

@ Pheonixblade9有趣...我試着將視圖更改爲adapterview,並在啓動時崩潰,將支持哪種類型的視圖? – 2013-05-10 21:45:49

回答

1

您正在使用LayoutInflater不當。在下面的代碼塊...

View dialoglayout = inflater.inflate(R.layout.settings_layout, (ViewGroup) getCurrentFocus()); 

...充氣試圖做兩兩件事:

  1. 使用附送的ViewGroup以確定根的LayoutParams
  2. 附上充氣XML佈局虛擬佈局到提供的ViewGroup

您不希望發生第二件事,因爲您將視圖移交給AlertDialog,而不將其附加到「當前焦點「(這顯然是你的崩潰日誌中的一個ListView)。你也不希望第一件事發生在書面上,因爲「當前焦點」不會成爲這個充氣視圖的父母,所以使用它來計算LayoutParams也毫無意義。

通常情況下,你應該總是通過你要重視爲inflate()第二個參數的直接父視圖,然後使用第三個參數,如果你不希望兩個附加在那個時候。然而,在這個例子中,你必須實際父視圖(這是內部的AlertDialog正在建設)沒有進入,它會覆蓋任何LayoutParams,所以你應該修改代碼以不通過父,而不斷膨脹:

View dialoglayout = inflater.inflate(R.layout.settings_layout, null); 
AlertDialog.Builder builder = new AlertDialog.Builder(this); 
builder.setView(dialoglayout); 

邊注:

同樣,這只是針對這種特殊情況。幾乎在每一個其他情況下你應該使用inflate()這樣的:

inflater.inflate(R.layout.settings_layout, parent, false);

如果您在充氣佈局的實際父視圖通過。

+0

謝謝你的工作!有趣的...所以我只是想確保我明白髮生了什麼...因爲這是一個警告對話框,它會以一種對listview不利的方式更改layoutparams。所以我們不給它父視圖,因爲我們希望它有自己的佈局參數? – 2013-05-10 22:08:30

+0

您正在擴充新的佈局以附加到'AlertDialog'。你的應用程序中的任何'ListView'與該討論沒有關係,所以在這段代碼中根本不應該考慮它。我所做的另外一點是,在正常情況下,您應該將父視圖傳遞給'inflate()',但是在對話框中您沒有傳入正確的視圖。 – Devunwired 2013-05-13 03:50:56