2013-05-10 18 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