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.
haben Sie onActivityCreated (Bundle b) – ByteMe
gleiche Problem überschreiben versucht. es heißt auf der ersten Seite, dann die zweite und von da an nur die zweite Seite. – r2DoesInc