2012-09-01 24 views
23

我正在使用Android片段和viewpager安裝程序。基本上有5個標籤可以滑過。Android上的「內容視圖尚未創建」片段

5中的4個包含由MySQL表填充的ListFragments;這是在AsyncTask內完成的。當我刷卡很快我有時會收到此錯誤:

09-01 07:54:01.243: E/AndroidRuntime(19706): FATAL EXCEPTION: main 
09-01 07:54:01.243: E/AndroidRuntime(19706): java.lang.IllegalStateException: Content view not yet created 
09-01 07:54:01.243: E/AndroidRuntime(19706): at android.support.v4.app.ListFragment.ensureList(ListFragment.java:328) 
09-01 07:54:01.243: E/AndroidRuntime(19706): at android.support.v4.app.ListFragment.getListView(ListFragment.java:222) 
09-01 07:54:01.243: E/AndroidRuntime(19706): at com.---.---.MasterCat$TopFrag$TopTask.onPostExecute(MasterCat.java:570) 
09-01 07:54:01.243: E/AndroidRuntime(19706): at com.---.---.MasterCat$TopFrag$TopTask.onPostExecute(MasterCat.java:1) 
09-01 07:54:01.243: E/AndroidRuntime(19706): at android.os.AsyncTask.finish(AsyncTask.java:631) 
09-01 07:54:01.243: E/AndroidRuntime(19706): at android.os.AsyncTask.access$600(AsyncTask.java:177) 
09-01 07:54:01.243: E/AndroidRuntime(19706): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 
09-01 07:54:01.243: E/AndroidRuntime(19706): at android.os.Handler.dispatchMessage(Handler.java:99) 
09-01 07:54:01.243: E/AndroidRuntime(19706): at android.os.Looper.loop(Looper.java:137) 
09-01 07:54:01.243: E/AndroidRuntime(19706): at android.app.ActivityThread.main(ActivityThread.java:4928) 
09-01 07:54:01.243: E/AndroidRuntime(19706): at java.lang.reflect.Method.invokeNative(Native Method) 
09-01 07:54:01.243: E/AndroidRuntime(19706): at java.lang.reflect.Method.invoke(Method.java:511) 
09-01 07:54:01.243: E/AndroidRuntime(19706): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791) 
09-01 07:54:01.243: E/AndroidRuntime(19706): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558) 
09-01 07:54:01.243: E/AndroidRuntime(19706): at dalvik.system.NativeStart.main(Native Method) 

我已經intentionly不使用ProgressDialog,因爲它使刷卡口吃了不少。

所以,我有兩個選擇,我需要幫助兩種方式:

  1. 如何避免這個錯誤,並保持清爽列表即使刷卡。

  2. 或者一旦加載了5個片段,關閉'刷新時刷新'。換句話說,除非您退出活動並返回,否則列表將保持不變。

我寧願選擇#1。請讓我知道你需要看看代碼:

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.fragment_layout); 


     mSectionsPagerAdapter = new SectionsPagerAdapter(
       getSupportFragmentManager()); 

     final ActionBar actionBar = getActionBar(); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

     mViewPager = (ViewPager) findViewById(R.id.viewpager); 
     mViewPager.setAdapter(mSectionsPagerAdapter); 

     mViewPager 
       .setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
        @Override 
        public void onPageSelected(int position) { 
         actionBar.setSelectedNavigationItem(position); 

        } 
       }); 

     for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) { 
      actionBar.addTab(actionBar.newTab() 
        .setText(mSectionsPagerAdapter.getPageTitle(i)) 
        .setTabListener(this)); 
     } 




    } 

    public void onTabUnselected(ActionBar.Tab tab, 
      FragmentTransaction fragmentTransaction) { 

    } 

    @Override 
    public void onSaveInstanceState(Bundle savedInstanceState) { 
      super.onSaveInstanceState(savedInstanceState); 
     } 

    @Override 
    public void onRestoreInstanceState(Bundle savedInstanceState) { 
     super.onRestoreInstanceState(savedInstanceState); 

    } 

    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) { 
     mViewPager.setCurrentItem(tab.getPosition()); 
    } 

    public void onTabReselected(ActionBar.Tab tab, 
      FragmentTransaction fragmentTransaction) { 
    } 

    public class SectionsPagerAdapter extends FragmentPagerAdapter { 

     public SectionsPagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      Fragment f = null; 
      switch (position) { 
      case 0: { 
       f = new MasterFrag(); 
       Bundle args = new Bundle(); 

       f.setArguments(args); 
       break; 
      } 
      case 1: { 
       f = new FeaturedFrag(); 
       Bundle args = new Bundle(); 

       f.setArguments(args); 
       break; 
      } 
      case 4: { 
       f = new TopFrag(); 
       Bundle args = new Bundle(); 

       f.setArguments(args); 
       break; 
      } 
      case 3: { 
       f = new NewFrag(); 
       Bundle args = new Bundle(); 

       f.setArguments(args); 
       break; 
      } 
      case 2: { 
       f = new TrendFrag(); 
       Bundle args = new Bundle(); 

       f.setArguments(args); 
       break; 
      } 
      default: 
       throw new IllegalArgumentException("not this many fragments: " 
         + position); 
      } 

      return f; 

     } 

此外,在logcat的參考線570涉及一種getListView()的的AsyncTask裏面這是上面沒有顯示一個ListFragment內。

編輯

添加5個片段之一 - 一個在logcat的引用 - 「TopFrag」

class TopTask extends AsyncTask<String, String, Void> { 
     InputStream is = null; 
     String result = ""; 

     @Override 
     protected Void doInBackground(String... params) { 
      String url_select = "http://www.---.com/---/---.php"; 

      HttpClient httpClient = new DefaultHttpClient(); 
      HttpPost httpPost = new HttpPost(url_select); 
      ArrayList<NameValuePair> param = new ArrayList<NameValuePair>(); 
      param.add(new BasicNameValuePair("Top", "Top")); 

      try { 
       httpPost.setEntity(new UrlEncodedFormEntity(param)); 
       HttpResponse httpResponse = httpClient.execute(httpPost); 
       HttpEntity httpEntity = httpResponse.getEntity(); 

       // read content 
       is = httpEntity.getContent(); 

      } catch (Exception e) { 

       Log.e("log_tag", "Error in http connection " + e.toString()); 
      } 
      try { 
       BufferedReader br = new BufferedReader(
         new InputStreamReader(is)); 
       StringBuilder sb = new StringBuilder(); 
       String line = ""; 
       while ((line = br.readLine()) != null) { 
        sb.append(line + "\n"); 
       } 
       is.close(); 
       result = sb.toString(); 

      } catch (Exception e) { 
       // TODO: handle exception 
       Log.e("log_tag", "Error converting result " + e.toString()); 
      } 

      return null; 

     } 

     protected void onPostExecute(Void v) { 

      String item, cat; 
      try { 
       JSONArray jArray = new JSONArray(result); 
       JSONObject json_data = null; 
       for (int i = 0; i < jArray.length(); i++) { 
        json_data = jArray.getJSONObject(i); 
        item = json_data.getString("item"); 
        cat = json_data.getString("category"); 


        items.add(item); 
        cats.add(cat); 



       } 
      } catch (JSONException e1) { 
       Toast.makeText(getActivity(), "No Top Items Found", 
         Toast.LENGTH_LONG).show(); 
      } catch (ParseException e1) { 
       e1.printStackTrace(); 
      } 

      ListView listView; 
      listView = getListView(); 
      listView.setTextFilterEnabled(true); 

      listView.setOnItemClickListener(new OnItemClickListener() { 

       public void onItemClick(AdapterView<?> arg0, View arg1, 
         int arg2, long id) { 
      // edit 

       } 
      }); 

      MasterCatObject[] mco = new MasterCatObject[items.size()]; 
      int index = 0; 

      for (@SuppressWarnings("unused") 
      String i : items) { 
       mco[index] = new MasterCatObject(items.get(index), 
         cats.get(index)); 
       index++; 
      } 

      adapter = new AllTimeAdapter(getActivity(), mco); 
      setListAdapter(adapter); 

     } 
    } 

} 

回答

23
at android.support.v4.app.ListFragment.getListView(ListFragment.java:222) 
at com.---.---.MasterCat$TopFrag$TopTask.onPostExecute(MasterCat.java:570) 

TopTask.onPostExecute()摸不得的UI,而這個片段不(在onCreateView之前)/不再(在onDestroyView之後)顯示。根本沒有ListView你可以得到。

您可以在此處執行的操作是更新ListView所使用的數據結構,以便下一次繪製列表時包含新數據。

+0

我正在通過普通的'getListView()'在PostExecute中獲取'ListView' - 將它放在OnActivityCreated中會更好嗎? – KickingLettuce

+2

'OnActivityCreated'應該可以工作,但是在調用'super'之後我會把它放在'onCreateView'中,因爲這肯定是一個你可以確定它在創建'ListView'時被調用的地方。 – zapl

+0

標記正確;我已經可以看到事情更加穩定。 – KickingLettuce

0

爲了避免碰撞可以檢查是否ListFragment isAdded())

異常ListFragment的時刻

被分離。

相關問題