2012-03-26 60 views
0

我有一個ViewPager,其中包含動態頁數。每個頁面都需要從數據庫中讀取並顯示該頁面的數據集。ViewPager,FragmentStatePagerAdapter,ListFragment每個片段的單獨列表數據

我比較當前選擇的頁面標題與數據庫「用戶名」中的第一個值,以檢查數據是否與該頁面相關。

我的片段雖然沒有正確顯示數據。我試圖在onCreateView中設置一個arrayAdapter,但它並沒有調用創建每個片段。在我的測試案例中,我有三個片段,user1,user2,user3。 onCreateView最初是在user1上調用的,然後當我滑回到user2時再次調用onCreateView,而不再爲user1或user3再次調用。

我需要能夠爲每個片段專門設置arrayAdapter,因爲每個片段都會顯示不同的值數組。

PagerAdapter

public class ExamplePagerAdapter extends FragmentStatePagerAdapter implements TitleProvider{ 

     private Map<Integer, UserFragment> mPageReferenceMap = new HashMap<Integer, UserFragment>(); 

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

     @Override 
     public int getCount() { 
      return user; 
     } 

     @Override 
     public Fragment getItem(int position) { 
      Fragment fragment = new UserFragment(); 

      Bundle args = new Bundle(); 
      fragment.setArguments(args);   
      return fragment; 
     } 

     @Override 
     public String getTitle(int pos) { 
      return "@"+users[pos].getName(); 
     } 

     @Override 
     public void destroyItem(View container, int position, Object object) {    
      mPageReferenceMap.remove(Integer.valueOf(position)); 
     } 
    } 

UserFragment

public class UserFragment extends ListFragment { 
     Context ctx; 
     View v; 
     Button mAddEntry; 
     static int p; 
     static ArrayList<String> entryArray; 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
      ctx = container.getContext(); 
      if (v != null) 
       return v; 

      v = inflater.inflate(R.layout.user_fragment, container, false); 
      mAddEntry = (Button) v.findViewById(R.id.entry_b); 
      mAddEntry.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Bundle b = new Bundle(); 
        b.putInt("pos", p); 
        Intent mi = new Intent(v.getContext(), EntryAdd.class); 
        mi.putExtras(b); 
        startActivity(mi); 
       } 
      });    
      updateUserFrag(); 
      return v;  
     }  

     public void updateUserFrag() {   
      entryArray = new ArrayList<String>(); 
      StringBuilder sb = new StringBuilder(); 
      final DBAdapter db = new DBAdapter(ctx); 
      db.open(); 
      Cursor c = db.getAllEntries(); 
      try { 
       while (c.moveToNext()) { 
        if (c.getString(0).equals(MainActivity.users[p].getName())) { 
         sb.append(c.getString(1)); 
         entryArray.add(sb.toString()); 
        } 
       } 
      } catch (Exception e) {} 
      c.close(); 
      db.close(); 

      ArrayAdapter<String> a = new ArrayAdapter<String>(ctx, android.R.layout.simple_list_item_1, entryArray); 
      setListAdapter(a); 
     } 

} 

基本上,我只需要我可以使用給每個片段其創建時其數據的方法。 onCreateView()不會爲每個片段調用,所以這對我沒有用。

UPDATE 我想我已經差不多了,但是我無法弄清楚這最後一部分。我使用TitlePageIndicators onPageSelected方法發送數據到我的片段處理程序。

TitlePageIndicator indicator = (TitlePageIndicator)findViewById(R.id.indicator); 
    indicator.setViewPager(pager, 0); 
    indicator.setOnPageChangeListener(new OnPageChangeListener() { 
     @Override 
     public void onPageSelected(int position) { 
       Message msg = UserFragment.handy.obtainMessage(); 
       Bundle b = new Bundle(); 
       b.putInt("m", 0); 
       b.putInt("p", position); 
       b.putStringArrayList("e", updateUserFrag(position)); 
       msg.setData(b); 
       UserFragment.handy.handleMessage(msg);     
     } 

處理器

static Handler handy = new Handler() { 
     public void handleMessage(Message msg) { 
      int p = msg.getData().getInt("p"); 
      int m = msg.getData().getInt("m"); 
      ArrayList<String> e = msg.getData().getStringArrayList("e"); 

      switch (m) { 
       case 0: 
        Log.d("HANDLER", Integer.toString(p)); 
        for (int i=0;i<e.size();i++) { 
         //Log.d("ENTRY", e.get(i)); 
        } 
       break; 
      } 
     } 
    }; 

的問題是,該處理程序被調用的時候,一個ArrayAdapter已經設置了,我能找到一種方法來觸發數據的刷新。

+0

你試圖重寫onActivityCreated(卷B) – ByteMe 2012-03-28 19:02:33

+0

同樣的問題。它的第一頁上,然後是第二頁,從那時起,只有第二頁。 – r2DoesInc 2012-03-28 20:17:01

回答

1
@Override 
    public void onPageSelected(int position) { 
      Message msg = UserFragment.handy.obtainMessage(); 
      Bundle b = new Bundle(); 
      b.putInt("m", 0); 
      b.putInt("p", position); 
      b.putStringArrayList("e", updateUserFrag(position)); 
      msg.setData(b); 
      UserFragment.handy.handleMessage(msg);     
    } 

    public ArrayList<String> updateUserFrag (int p) {   
     entryArray = new ArrayList<String>(); 
     StringBuilder sb = new StringBuilder(); 
     DBAdapter db = new DBAdapter(this); 
     db.open(); 
     Cursor c = db.getAllEntries(); 
     try { 
      while (c.moveToNext()) { 
       if (c.getString(0).equals(users[p].getName())) { 
        sb.append(c.getString(1)); 
        entryArray.add(sb.toString()); 
       } 
      } 
     } catch (Exception e) {} 
     c.close(); 
     db.close(); 
     return entryArray;   
    } 

UserFragment

public class UserFragment extends ListFragment { 
     Context ctx; 
     View v; 
     Button mAddEntry; 
     static int p; 
     static ArrayList<String> entryArray; 
     static ArrayAdapter<String> a; 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
      ctx = container.getContext(); 
      if (v != null) 
       return v; 

      v = inflater.inflate(R.layout.user_fragment, container, false); 
      mAddEntry = (Button) v.findViewById(R.id.entry_b); 
      mAddEntry.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Bundle b = new Bundle(); 
        b.putInt("pos", p); 
        Intent mi = new Intent(v.getContext(), EntryAdd.class); 
        mi.putExtras(b); 
        startActivity(mi); 
       } 
      });  
      updateUserFrag(p); 
      return v;  
     }  

     public void updateUserFrag (int p) {   
      entryArray = new ArrayList<String>(); 
      a = new ArrayAdapter<String>(ctx, android.R.layout.simple_list_item_1, entryArray); 
      setListAdapter(a); 
     } 

     static Handler handy = new Handler() { 
      public void handleMessage(Message msg) { 
       int p = msg.getData().getInt("p"); 
       int m = msg.getData().getInt("m"); 
       ArrayList<String> e = msg.getData().getStringArrayList("e"); 

       switch (m) { 
        case 0: 
         Log.d("HANDLER", Integer.toString(p)); 
         entryArray.clear(); 
         for (int i=0;i<e.size();i++) { 
          entryArray.add(e.get(i)); 
         } 
         a.notifyDataSetChanged(); 
        break; 
       } 
      } 
     };  
} 
相關問題