我有一个ViewPager设置,它从服务器传递的数据中为其页面(视图)绘制数据.有时,服务器将发送将重新排序视图的新数据(有时会添加新视图),我需要在用户当前查看特定片段时在我的
Android设备上无缝地进行此操作.
我将它设置为在从服务器下拉新数据时调用notifyDataSetChanged(),但这似乎将幻灯片的缓存版本保留在当前查看的幻灯片的左侧和右侧,这可能会随着重新排序而改变.我在这里看了这个主题:ViewPager PagerAdapter not updating the View并实现了第一个工作正常的解决方案,除了它重新加载正在查看的当前幻灯片,这对我的目的不起作用.我在第二个答案中实现了在同一页面上提出的setTag()方法,并且可以用于更新幻灯片上的信息,但是它不会帮助我重新排序它们.
有什么方法可以重新排序幕后的所有幻灯片,而不会在当前查看的幻灯片中造成任何打击?
TIA
这是我的Adapter类.
- 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));
- }