我有一个ViewPager设置,它是从服务器传递下来的数据绘制其页面(视图)的数据。有时,服务器会发送新的数据,重新排序视图(有时添加新的视图),我需要在我的android设备上无缝地发生,而用户当前正在查看特定的片段。
我将其设置为在从服务器拉下新数据时调用notifyDataSetChanged(),但这似乎在当前查看的幻灯片的左侧和右侧保留了幻灯片的缓存版本,这可能会随着重新排序而改变。我在这里看了这个主题:ViewPager PagerAdapter没有更新视图,并实现了第一个解决方案,它工作得很好,除了它重新加载当前正在查看的幻灯片,这将不适合我的目的。在第二个答案中,我对在同一页面上提出的setTag()方法的实现进行了粗略的研究,该方法可以用于更新幻灯片上的信息,但它不能帮助我重新排序它们。
是否有某种方法可以在幕后重新排列所有幻灯片,而不会在当前查看的幻灯片中造成任何打嗝?
TIA
编辑:添加代码并要求进一步澄清
这是适配器类。
private class ScreenSlidePagerAdapter extends FragmentPagerAdapter {
ContestEntriesModel entries;
public ScreenSlidePagerAdapter(FragmentManager fm, ContestEntriesModel Entries) {
super(fm);
this.entries = Entries;
}
@Override
public long getItemId(int position) {
return entries.entries[position].ContestEntryId;
}
@Override
public int getItemPosition(Object object) {
android.support.v4.app.Fragment f = (android.support.v4.app.Fragment)object;
for(int i = 0; i < getCount(); i++){
android.support.v4.app.Fragment fragment = getItem(i);
if(f.equals(fragment)){
return i;
}
}
return POSITION_NONE;
}
@Override
public android.support.v4.app.Fragment getItem(int position) {
long entryId = getItemId(position);
//Log.d("EntryIds",Integer.toString(entryId));
if(mItems.get(entryId) != null) {
return mItems.get(entryId);
}
Fragment f = ScreenSlidePageFragment.create(position);
mItems.put(entryId, f);
return f;
}
@Override
public int getCount() {
return NUM_PAGES;
}
}
当一个新的有效负载从服务器下来时,我使用的是:
@Override
protected void onPostExecute(ContestEntriesModel entries) {
Fragment currentFragment = ContestEntries.mItems.get(ContestEntries.CurrentEntryId);
Log.d("fromUpdate",Long.toString(ContestEntries.CurrentEntryId));
ContestEntries.Entries = entries;
ContestEntries.NUM_PAGES = ContestEntries.Entries.entries.length;
ContestEntries.mPagerAdapter.notifyDataSetChanged();
ContestEntries.mPager.setCurrentItem(ContestEntries.mPagerAdapter.getItemPosition(currentFragment));
}
点击这里查看我的答案。关键是重写适配器中的getItemId(int)
和getItemPosition(Object)
。
getItemId(int)
用于在数据集中唯一地标识您的页面。getItemPosition(Object)
用于获取数据集中这个唯一页面的(更新的)位置。
如果您想在更新(添加/删除页面)之前和之后保持对同一页面的关注,您应该在适配器上调用.notifyDataSetChanged()
后调用viewpager.setCurrentItem(int)
以获取页面的新位置。