0

J'ai un ViewPager avec un nombre de pages dynamique. Chacune de ces pages doit lire à partir d'une base de données et afficher l'ensemble de données pour cette page.ViewPager, FragmentStatePagerAdapter, ListFragment données de liste séparées pour chaque fragment

Je compare le titre des pages actuellement sélectionné avec la première valeur du db "nom d'utilisateur" pour vérifier si les données sont pertinentes pour cette page.

Mes fragments, bien que ne pas afficher les données correctement. Im essayant de placer un arrayAdapter dans le onCreateView, mais il n'est pas appelé sur la création de chaque fragment. Dans mon cas de test, j'ai trois fragments, user1, user2, user3. OnCreateView est appelé sur user1 à l'origine, puis n'est appelé que lorsque je retourne à user2, et plus jamais pour user1 ou user3.

Je dois être en mesure de définir l'arrayAdapter pour chaque fragment spécifiquement parce que chacun aura un tableau différent de valeurs à afficher.

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

} 

Fondamentalement, j'ai juste besoin d'une méthode que je peux utiliser pour donner à chaque fragment ses données lorsque son créé. OnCreateView() n'est pas appelé pour chaque fragment, donc ce n'est pas utile pour moi.

MISE À JOUR Je pense que j'ai presque compris, mais je n'arrive pas à comprendre cette dernière partie. Im en utilisant TitlePageIndicators onPageSelected méthode pour envoyer des données à mon gestionnaire de fragment.

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

Le problème est qu'au moment où le gestionnaire est appelé, le Arrayadapter a déjà été défini, et je peux trouver un moyen de déclencher une actualisation de ces données.

+0

Avez-vous essayé primordial onActivityCreated (Bundle b) – ByteMe

+0

même problème. il est appelé sur la première page, puis la seconde, et à partir de là, seulement la deuxième page. – r2DoesInc

Répondre

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