2012-09-01 30 views
23

Tôi đang sử dụng Phân đoạn Android với thiết lập viewpager. Về cơ bản có 5 tab bạn có thể vuốt qua."Chế độ xem nội dung chưa được tạo" trên Android Fragments

4 trong số 5 chứa ListFragments được điền bởi các bảng MySQL; điều này được thực hiện bên trong một số AsyncTask. Khi tôi vuốt rất nhanh đôi khi tôi nhận được lỗi này:

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) 

Tôi đã intentionly không được sử dụng một ProgressDialog vì nó làm cho swiping nói lắp khá một chút.

Vì vậy, tôi có hai lựa chọn và tôi cần giúp một trong hai cách:

  1. Làm thế nào để ngăn chặn lỗi này và giữ danh sách làm mới ngay cả khi trượt.

  2. HOẶC một khi 5 đoạn được tải, hãy tắt 'làm mới khi vuốt'. Nói cách khác, danh sách sẽ vẫn giữ nguyên trừ khi bạn thoát khỏi Hoạt động và quay lại.

Tôi muốn tùy chọn # 1. Xin vui lòng cho tôi biết những gì mã bạn cần phải nhìn thấy:

@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; 

     } 

Ngoài ra, dòng 570 tham chiếu trong LogCat gắn liền với một getListView() bên trong một AsyncTask đó là bên trong một ListFragment không được hiển thị ở trên.

EDIT:

Thêm một trong 5 Những mảnh vỡ - một trong những tham chiếu trong 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); 

     } 
    } 

} 

Trả lời

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

bạn TopTask.onPostExecute() không phải chạm vào giao diện người dùng trong khi đoạn không phải là chưa (trước onCreateView)/không còn (sau khi onDestroyView) được hiển thị. Chỉ đơn giản là không có ListView bạn có thể nhận được.

Việc bạn có thể thực hiện ở đây là cập nhật cấu trúc cơ sở được sử dụng bởi ListView để lần tiếp theo danh sách được vẽ bao gồm dữ liệu mới.

+0

Tôi nhận được 'ListView' bằng' getListView() 'bình thường bên trong PostExecute - sẽ tốt hơn nếu đặt nó trong' OnActivityCreated'? – KickingLettuce

+2

'OnActivityCreated' sẽ hoạt động nhưng tôi sẽ đặt nó trong' onCreateView' sau khi gọi 'super' vì đó chắc chắn là một nơi mà bạn có thể chắc chắn rằng nó được gọi khi' ListView' được tạo ra. – zapl

+0

Đánh dấu chính xác; Tôi có thể thấy mọi thứ ổn định hơn nhiều. – KickingLettuce

0

Để tránh sự cố có thể kiểm tra xem ListFragment isAdded())

trong thời điểm ngoại lệ ListFragment được tách ra.

Các vấn đề liên quan