我有一個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已經設置了,我能找到一種方法來觸發數據的刷新。
你試圖重寫onActivityCreated(卷B) – ByteMe 2012-03-28 19:02:33
同樣的問題。它的第一頁上,然後是第二頁,從那時起,只有第二頁。 – r2DoesInc 2012-03-28 20:17:01