2012-03-26 11 views
0

Ich habe einen ViewPager mit einer dynamischen Anzahl von Seiten darin. Jede dieser Seiten muss aus einer Datenbank lesen und das Dataset für diese Seite anzeigen.ViewPager, FragmentStatePagerAdapter, ListFragment separate Listendaten für jedes Fragment

Ich vergleiche den Titel der aktuell ausgewählten Seiten mit dem ersten Wert in der Datenbank "Benutzername", um zu prüfen, ob die Daten für diese Seite relevant sind.

Meine Fragmente zeigen die Daten nicht korrekt an. Ich versuche, ein ArrayAdapter in der onCreateView festzulegen, aber es wird nicht bei der Erstellung jedes Fragments aufgerufen. In meinem Testfall habe ich drei Fragmente, user1, user2, user3. onCreateView wird ursprünglich auf Benutzer1 aufgerufen und dann nur erneut aufgerufen, wenn ich zurück zu Benutzer2 wische und nie wieder für Benutzer1 oder Benutzer3.

Ich muss in der Lage sein, die ArrayAdapter für jedes Fragment speziell festlegen, weil jeder ein anderes Array von Werten zur Anzeige haben wird.

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); 
     } 

} 

Grundsätzlich I I jedes Fragment seine Daten können nur eine Methode verwenden müssen geben, wenn dessen erstellt. onCreateView() wird nicht für jedes Fragment aufgerufen, daher ist das für mich nicht sinnvoll.

UPDATE Ich glaube, ich habe es fast, aber ich kann diesen letzten Teil nicht herausfinden. Ich benutze die Methode "TitlePageIndicators onPageSelected", um Daten an meinen Fragment-Handler zu senden.

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);     
     } 

Handler

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

Das Problem ist, dass der Handler durch die Zeit genannt wird, hat sich die Arrayadapter bereits eingestellt worden ist, und ich kann einen Weg auszulösen eine Aktualisierung dieser Daten finden.

+0

haben Sie onActivityCreated (Bundle b) – ByteMe

+0

gleiche Problem überschreiben versucht. es heißt auf der ersten Seite, dann die zweite und von da an nur die zweite Seite. – r2DoesInc

Antwort

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