2013-08-02 42 views
3

我在我的應用程序中使用ListFragment,我想使它有一個OnItemClick監聽器的列表中的每個項目,但是當我添加ListView lv = getListView();我得到一個錯誤。如果我刪除該列表視圖的工作但是,那麼將沒有onclick監聽器,我需要爲我的應用程序。Android的 - getListView()錯誤ListFragment

下面是我的代碼

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 

    ArrayList<HashMap<String, String>> menuItems = new ArrayList<HashMap<String, String>>(); 

//...  

    ListAdapter adapter = new SimpleAdapter(getActivity(), menuItems, 
      R.layout.list_item, 
      new String[] { KEY_NAME, KEY_DESC, KEY_COST }, new int[] { 
        R.id.name, R.id.desciption, R.id.cost }); 

    setListAdapter(adapter); 

    ListView lv = getListView(); 
//HERE IS WHERE I AM GETTING THE ERROR 

    lv.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, 
       int position, long id) { 
      // getting values from selected ListItem 
      String name = ((TextView) view.findViewById(R.id.name)).getText().toString(); 
      String cost = ((TextView) view.findViewById(R.id.cost)).getText().toString(); 
      String description = ((TextView) view.findViewById(R.id.desciption)).getText().toString(); 

      // Starting new intent 
      Intent in = new Intent(getActivity().getApplicationContext(), SingleMenuItemActivity.class); 
      in.putExtra(KEY_NAME, name); 
      in.putExtra(KEY_COST, cost); 
      in.putExtra(KEY_DESC, description); 
      startActivity(in); 

     } 
    }); 

    return super.onCreateView(inflater, container, savedInstanceState); 
} 

的logcat低於

08-01 23:24:47.152: E/AndroidRuntime(18883): FATAL EXCEPTION: main 
08-01 23:24:47.152: E/AndroidRuntime(18883): java.lang.IllegalStateException: Content view not yet created 
08-01 23:24:47.152: E/AndroidRuntime(18883): at android.support.v4.app.ListFragment.ensureList(ListFragment.java:328) 
08-01 23:24:47.152: E/AndroidRuntime(18883): at android.support.v4.app.ListFragment.getListView(ListFragment.java:222) 
08-01 23:24:47.152: E/AndroidRuntime(18883): at com.OptimusApps.stayhealthy.AndroidXMLParsingActivity.onCreateView(AndroidXMLParsingActivity.java:74) 
08-01 23:24:47.152: E/AndroidRuntime(18883): at android.support.v4.app.Fragment.performCreateView(Fragment.java:1470) 
08-01 23:24:47.152: E/AndroidRuntime(18883): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:925) 
08-01 23:24:47.152: E/AndroidRuntime(18883): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1102) 
08-01 23:24:47.152: E/AndroidRuntime(18883): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) 
08-01 23:24:47.152: E/AndroidRuntime(18883): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1458) 
08-01 23:24:47.152: E/AndroidRuntime(18883): at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:438) 
08-01 23:24:47.152: E/AndroidRuntime(18883): at android.os.Handler.handleCallback(Handler.java:605) 
08-01 23:24:47.152: E/AndroidRuntime(18883): at android.os.Handler.dispatchMessage(Handler.java:92) 
08-01 23:24:47.152: E/AndroidRuntime(18883): at android.os.Looper.loop(Looper.java:137) 
08-01 23:24:47.152: E/AndroidRuntime(18883): at android.app.ActivityThread.main(ActivityThread.java:4575) 
08-01 23:24:47.152: E/AndroidRuntime(18883): at java.lang.reflect.Method.invokeNative(Native Method) 
08-01 23:24:47.152: E/AndroidRuntime(18883): at java.lang.reflect.Method.invoke(Method.java:511) 
08-01 23:24:47.152: E/AndroidRuntime(18883): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 
08-01 23:24:47.152: E/AndroidRuntime(18883): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556) 
08-01 23:24:47.152: E/AndroidRuntime(18883): at dalvik.system.NativeStart.main(Native Method) 

感謝

回答

1

您需要inflat的觀點之前,你可以使用它。

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     v = inflater.inflate(R.layout.list, container, false); 
      // Set adapter etc 

     return v; 
    } 

佈局list.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingLeft="2dp" 
    android:paddingRight="2dp" > 

    <ListView 
     android:id="@id/android:list" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:drawSelectorOnTop="false" /> 

    <ProgressBar 
     android:id="@id/android:empty" 
     style="?android:attr/progressBarStyleLarge" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     /> 

</RelativeLayout> 

使用onListItemClick

@Override 
public void onListItemClick(ListView l, View v, int position, long id) { 
    //Responding to clicks 
} 
+0

心不是列表中的ID不是一個佈局? –

+0

添加此'視圖v = inflater.inflate(R.layout.main,容器,FALSE);'和'的ListView LV =(ListView中)v.findViewById(android.R.id.list);'現在OnItemCLickListener心不是響應 –

+0

@CamConnor嘗試使用onListItemClick。答案已更新。 – SteD

0

您直接致電

getListView().setOnItemClickListener(new OnItemClickListener() { 

    @Override 
    public void onItemClick(AdapterView<?> parent, View view, 
      int position, long id) { 
     // getting values from selected ListItem 
     String name = ((TextView) view.findViewById(R.id.name)).getText().toString(); 
     String cost = ((TextView) view.findViewById(R.id.cost)).getText().toString(); 
     String description = ((TextView) view.findViewById(R.id.desciption)).getText().toString(); 

     // Starting new intent 
     Intent in = new Intent(getActivity().getApplicationContext(), SingleMenuItemActivity.class); 
     in.putExtra(KEY_NAME, name); 
     in.putExtra(KEY_COST, cost); 
     in.putExtra(KEY_DESC, description); 
     startActivity(in); 

    } 
}); 
+0

沒有解決問題 –

+0

你有沒有其他解決辦法? –

+0

你先創建一個視圖。 – Satheesh

9

只要把你的代碼中onActivityCreated(),並用簡單的getListView()方法有管理的ListView ..

+2

安東尼奧的答案是正確的。這應該被標記爲答案。您正在訪問「OnCreateView」中的視圖,但尚未返回。將你的代碼移動到'OnViewCreated'並且它會工作。 –

+0

是:'@Override \t公共無效onActivityCreated(捆綁savedInstanceState){ \t \t super.onActivityCreated(savedInstanceState); \t \t getListView()。setOnScrollListener(this); \t}' –