2013-01-01 91 views
0

1-我想使用ListFragment。在片段中使用ListView

2 - 我的类从Activity不是ListActivity(因为我想在ListView的顶部有一个TextView)。作为一个结果,这是主要的布局:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 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/txt" 
      android:layout_width="fill_parent" 
      android:layout_height="40sp" /> 

    <ListView 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/listView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

</LinearLayout> 

这我的代码:

public class List1 extends SherlockListFragment { 

    private ArrayList<String> list = new ArrayList<String>(); 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     System.out.println("onCreate............"); 

     for(int i=0; i<30; i++) 
      list.add("item " + i); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     System.out.println("onCreateView................."); 

     View view = inflater.inflate(R.layout.main_list1, container, false); 

     TextView label = (TextView) view.findViewById(R.id.txt); 
     label.setText("Hello"); 

     ListView lv = (ListView) view.findViewById(R.id.listView); 
      lv.setAdapter(new MultiAdapter(view.getContext())); 

     return view; 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     System.out.println("onActivityCreated.........."); 


    } 

    private class MultiAdapter extends ArrayAdapter<String> { 

     public MultiAdapter(Context context) { 
      super(context, R.layout.list1, list); 
     } 

     @Override 
     // Called when updating the ListView 
     public View getView(int position, View convertView, ViewGroup parent) { 

      View row; 

      if (convertView == null) { 
       LayoutInflater inflater = getActivity().getLayoutInflater(); 
       row = inflater.inflate(R.layout.list1, parent, false); 
      } else 
       row = convertView; 

      TextView txt = (TextView) row.findViewById(R.id.label); 
      txt.setText(list.get(position));  

      return row; 
     } 
    } 

当我使用Tab键去这个片段的应用程序崩溃。这是我在日志中得到了异常:

01-01 14:59:51.154: E/AndroidRuntime(20091): FATAL EXCEPTION: main 
01-01 14:59:51.154: E/AndroidRuntime(20091): java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list' 
01-01 14:59:51.154: E/AndroidRuntime(20091): at android.support.v4.app.ListFragment.ensureList(ListFragment.java:344) 
01-01 14:59:51.154: E/AndroidRuntime(20091): at android.support.v4.app.ListFragment.onViewCreated(ListFragment.java:145) 
01-01 14:59:51.154: E/AndroidRuntime(20091): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:884) 
01-01 14:59:51.154: E/AndroidRuntime(20091): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1080) 
01-01 14:59:51.154: E/AndroidRuntime(20091): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:622) 
01-01 14:59:51.154: E/AndroidRuntime(20091): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1416) 
01-01 14:59:51.154: E/AndroidRuntime(20091): at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:431) 
01-01 14:59:51.154: E/AndroidRuntime(20091): at com.example.tabtest.FragmentTab$TabManager.onTabChanged(FragmentTab.java:134) 
01-01 14:59:51.154: E/AndroidRuntime(20091): at android.widget.TabHost.invokeOnTabChangeListener(TabHost.java:359) 
01-01 14:59:51.154: E/AndroidRuntime(20091): at android.widget.TabHost.setCurrentTab(TabHost.java:344) 
01-01 14:59:51.154: E/AndroidRuntime(20091): at android.widget.TabHost$2.onTabSelectionChanged(TabHost.java:132) 
01-01 14:59:51.154: E/AndroidRuntime(20091): at android.widget.TabWidget$TabClickListener.onClick(TabWidget.java:458) 
01-01 14:59:51.154: E/AndroidRuntime(20091): at android.view.View.performClick(View.java:2533) 
01-01 14:59:51.154: E/AndroidRuntime(20091): at android.view.View$PerformClick.run(View.java:9320) 
01-01 14:59:51.154: E/AndroidRuntime(20091): at android.os.Handler.handleCallback(Handler.java:587) 
01-01 14:59:51.154: E/AndroidRuntime(20091): at android.os.Handler.dispatchMessage(Handler.java:92) 
01-01 14:59:51.154: E/AndroidRuntime(20091): at android.os.Looper.loop(Looper.java:150) 
01-01 14:59:51.154: E/AndroidRuntime(20091): at android.app.ActivityThread.main(ActivityThread.java:4385) 
01-01 14:59:51.154: E/AndroidRuntime(20091): at java.lang.reflect.Method.invokeNative(Native Method) 
01-01 14:59:51.154: E/AndroidRuntime(20091): at java.lang.reflect.Method.invoke(Method.java:507) 
01-01 14:59:51.154: E/AndroidRuntime(20091): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849) 
01-01 14:59:51.154: E/AndroidRuntime(20091): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607) 
01-01 14:59:51.154: E/AndroidRuntime(20091): at dalvik.system.NativeStart.main(Native Method) 

回答

1

你的片段布局必须有一个ListView与ID:android.R.id.list,否则Android将不知道使用哪个ListView控件。

像这样:

<ListView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/list" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" /> 

通知的android:id="@android:id/list"

+0

谢谢汤姆。你是完全正确的。 – Ali