2014-11-06 67 views
1

當我嘗試打開由listview組成的片段時,我的應用程序崩潰。嘗試使用列表視圖打開片段時應用程序崩潰

場景:

  1. 打開fragmentA首次,列表視圖不顯示。

  2. 單擊fragmentA上的按鈕(即片段B)。

  3. 點擊後退按鈕,同時在fragmentB上顯示fragmentA上的listview。

  4. 退出應用程序,嘗試再次打開fragmentA,應用程序崩潰。

我的片段類:

public class FamilyTreeFragment extends Fragment { 

// Declare Variables 
ListView listview; 
List<ParseObject> ob; 
ProgressDialog mProgressDialog; 
FamilyTreeListViewAdapter adapter; 
private List<FamilyTree> familytreelist = null; 
View rootView; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.fragment_familytree, container, false); 

    new RemoteDataTask().execute(); 
    // Locate the listview in listview_main.xml 
    listview = (ListView) rootView.findViewById(R.id.list); 
    // Pass the results into ListViewAdapter.java 
    // adapter = new FamilyTreeListViewAdapter(getActivity(), familytreelist); 
    // Binds the Adapter to the ListView 
    // listview.setAdapter(adapter); 
    // Close the progressdialog 
    mProgressDialog.dismiss(); 

    // btn_add 
    Button btn_add = (Button) rootView.findViewById(R.id.btn_add); 
    btn_add.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      // Toast.makeText(SuggestionsFragment.this.getActivity(), 
      // "You have selected Parks.", Toast.LENGTH_SHORT).show(); 
      getFragmentManager().beginTransaction().replace(R.id.container, new FamilyTreeFragment2()).addToBackStack(null).commit(); 
     } 
    }); 

    return rootView; 
} 

// RemoteDataTask AsyncTask 
private class RemoteDataTask extends AsyncTask<Void, Void, Void> { 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     // Create a progressdialog 
     mProgressDialog = new ProgressDialog(getActivity()); 
     // Set progressdialog title 
     mProgressDialog.setTitle(""); 
     // Set progressdialog message 
     mProgressDialog.setMessage("Loading..."); 
     mProgressDialog.setIndeterminate(false); 
     // Show progressdialog 
     mProgressDialog.show(); 

    } 

    protected Void doInBackground(Void... arg0) { 
     // Create the array 
     familytreelist = new ArrayList<FamilyTree>(); 
     try { 
      // Locate the class table named "Country" in Parse.com 
      ParseQuery<ParseObject> query = new ParseQuery<ParseObject>("FamilyTree"); 
      // Locate the column named "ranknum" in Parse.com and order list 
      // by ascending 
      query.orderByAscending("createdAt"); 
      ob = query.find(); 
      for (ParseObject familytree : ob) { 
       // Locate images in flag column 
       ParseFile image = (ParseFile) familytree.get("image"); 

       FamilyTree tree = new FamilyTree(); 
       tree.setName((String) familytree.get("name")); 
       tree.setRelation((String) familytree.get("relation")); 
       tree.setImage(image.getUrl()); 
       familytreelist.add(tree); 
      } 
     } catch (ParseException e) { 
      Log.e("Error", e.getMessage()); 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    protected void onPostExecute(Void result) { 

     // Locate the listview in listview_main.xml 
     listview = (ListView) rootView.findViewById(R.id.list); 
     // Pass the results into ListViewAdapter.java 
     adapter = new FamilyTreeListViewAdapter(getActivity(), familytreelist); 
     // Binds the Adapter to the ListView 
     listview.setAdapter(adapter); 
     // Close the progressdialog 
     // mProgressDialog.dismiss(); 
    } 
} 

} 

XML:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/familytreecontainer" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" 
tools:context="com.example.parcel.FamilyTreeFragment$PlaceholderFragment" > 

<ListView 
    android:id="@+id/list" 
    android:layout_width="match_parent" 
    android:layout_height="407dp" 
    android:layout_weight="2.86" > 
</ListView> 

<Button 
    android:id="@+id/btn_add" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="Add" /> 

的logcat:

11-06 17:01:06.500: E/AndroidRuntime(22072): FATAL EXCEPTION: main 
11-06 17:01:06.500: E/AndroidRuntime(22072): Process: com.example.parcel, PID: 22072 
11-06 17:01:06.500: E/AndroidRuntime(22072): java.lang.NullPointerException 
11-06 17:01:06.500: E/AndroidRuntime(22072): at com.example.parcel.FamilyTreeFragment$RemoteDataTask.onPostExecute(FamilyTreeFragment.java:111) 
11-06 17:01:06.500: E/AndroidRuntime(22072): at com.example.parcel.FamilyTreeFragment$RemoteDataTask.onPostExecute(FamilyTreeFragment.java:1) 
11-06 17:01:06.500: E/AndroidRuntime(22072): at android.os.AsyncTask.finish(AsyncTask.java:632) 
11-06 17:01:06.500: E/AndroidRuntime(22072): at android.os.AsyncTask.access$600(AsyncTask.java:177) 
11-06 17:01:06.500: E/AndroidRuntime(22072): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645) 
11-06 17:01:06.500: E/AndroidRuntime(22072): at android.os.Handler.dispatchMessage(Handler.java:102) 
11-06 17:01:06.500: E/AndroidRuntime(22072): at android.os.Looper.loop(Looper.java:157) 
11-06 17:01:06.500: E/AndroidRuntime(22072): at android.app.ActivityThread.main(ActivityThread.java:5867) 
11-06 17:01:06.500: E/AndroidRuntime(22072): at java.lang.reflect.Method.invokeNative(Native Method) 
11-06 17:01:06.500: E/AndroidRuntime(22072): at java.lang.reflect.Method.invoke(Method.java:515) 
11-06 17:01:06.500: E/AndroidRuntime(22072): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
11-06 17:01:06.500: E/AndroidRuntime(22072): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:674) 
11-06 17:01:06.500: E/AndroidRuntime(22072): at dalvik.system.NativeStart.main(Native Method) 

我該如何解決這個問題?任何幫助表示讚賞。謝謝。

回答

0

試試這種方式,希望這會幫助你解決你的問題。

查看rootView = inflater.inflate(R.layout.fragment_familytree,container,false);

替換爲

rootView = inflater.inflate(R.layout.fragment_familytree,容器,FALSE);

錯誤原因:

你必須在一流水平decalre rootView但不能初始化在onCreateView(),您在onCreateView()內拍攝的rootView局部變量,以便onPostExecute()rootView將點上課級別變量仍然未初始化。

良好的格式化代碼:

public class FamilyTreeFragment extends Fragment { 

    // Declare Variables 
    private ListView listview; 
    private Button btn_add; 
    private FamilyTreeListViewAdapter adapter; 
    private List<FamilyTree> familytreelist; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_familytree, container, false); 

     listview = (ListView) rootView.findViewById(R.id.list); 
     btn_add = (Button) rootView.findViewById(R.id.btn_add); 

     mProgressDialog.dismiss(); 
     btn_add.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       // Toast.makeText(SuggestionsFragment.this.getActivity(), 
       // "You have selected Parks.", Toast.LENGTH_SHORT).show(); 
       getFragmentManager().beginTransaction().replace(R.id.container, new FamilyTreeFragment2()).addToBackStack(null).commit(); 
      } 
     }); 

     new RemoteDataTask().execute(); 
     return rootView; 
    } 

    // RemoteDataTask AsyncTask 
    private class RemoteDataTask extends AsyncTask<Void, Void, List<FamilyTree>> { 
     private ProgressDialog mProgressDialog; 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      // Create a progressdialog 
      mProgressDialog = new ProgressDialog(getActivity()); 
      // Set progressdialog title 
      mProgressDialog.setTitle(""); 
      // Set progressdialog message 
      mProgressDialog.setMessage("Loading..."); 
      mProgressDialog.setIndeterminate(false); 
      // Show progressdialog 
      mProgressDialog.show(); 

     } 

     protected List<FamilyTree> doInBackground(Void... arg0) { 
      // Create the array 
      List<FamilyTree> list = new ArrayList<FamilyTree>(); 
      try { 
       // Locate the class table named "Country" in Parse.com 
       ParseQuery<ParseObject> query = new ParseQuery<ParseObject>("FamilyTree"); 
       // Locate the column named "ranknum" in Parse.com and order list 
       // by ascending 
       query.orderByAscending("createdAt"); 
       List<ParseObject> ob = query.find(); 
       for (ParseObject familytree : ob) { 
        // Locate images in flag column 
        ParseFile image = (ParseFile) familytree.get("image"); 

        FamilyTree tree = new FamilyTree(); 
        tree.setName((String) familytree.get("name")); 
        tree.setRelation((String) familytree.get("relation")); 
        tree.setImage(image.getUrl()); 
        list.add(tree); 
       } 
      } catch (ParseException e) { 
       e.printStackTrace(); 
       Log.e("Error", e.getMessage()); 
      } 
      return list; 
     } 

     protected void onPostExecute(List<FamilyTree> result) { 
      super.onPostExecute(result); 

      if(mProgressDialog!=null && mProgressDialog.isShowing()){ 
       mProgressDialog.dismiss(); 
      } 
      if(familytreelist==null){ 
       familytreelist = new ArrayList<FamilyTree>(); 
      } 

      familytreelist.addAll(result); 

      // Pass the results into ListViewAdapter.java 
      adapter = new FamilyTreeListViewAdapter(getActivity(), familytreelist); 
      // Binds the Adapter to the ListView 
      listview.setAdapter(adapter); 
     } 
    } 

} 
+0

嗨。我更換了 查看rootView = inflater.inflate(R.layout.fragment_familytree,container,false); 與 rootView = inflater.inflate(R.layout.fragment_familytree,container,false); 並刪除onPostExecute()聲明的列表視圖,它的工作原理!非常感謝! – Alxy 2014-11-06 09:22:54

+0

那麼它給出的仍然是錯誤? – 2014-11-06 09:23:56

+0

它已經在工作。謝謝。 :) – Alxy 2014-11-06 09:25:59

相關問題