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.
Avez-vous essayé primordial onActivityCreated (Bundle b) – ByteMe
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