android – 使用新订单中的片段更新viewpager

前端之家收集整理的这篇文章主要介绍了android – 使用新订单中的片段更新viewpager前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个ViewPager设置,它从服务器传递的数据中为其页面(视图)绘制数据.有时,服务器将发送将重新排序视图的新数据(有时会添加新视图),我需要在用户当前查看特定片段时在我的 Android设备上无缝地进行此操作.

我将它设置为在从服务器下拉新数据时调用notifyDataSetChanged(),但这似乎将幻灯片的缓存版本保留在当前查看的幻灯片的左侧和右侧,这可能会随着重新排序而改变.我在这里看了这个主题ViewPager PagerAdapter not updating the View并实现了第一个工作正常的解决方案,除了它重新加载正在查看的当前幻灯片,这对我的目的不起作用.我在第二个答案中实现了在同一页面上提出的setTag()方法,并且可以用于更新幻灯片上的信息,但是它不会帮助我重新排序它们.

有什么方法可以重新排序幕后的所有幻灯片,而不会在当前查看的幻灯片中造成任何打击?

TIA

编辑:添加代码并要求进一步澄清

这是我的Adapter类.

  1. private class ScreenSlidePagerAdapter extends FragmentPagerAdapter {
  2. ContestEntriesModel entries;
  3.  
  4. public ScreenSlidePagerAdapter(FragmentManager fm,ContestEntriesModel Entries) {
  5. super(fm);
  6. this.entries = Entries;
  7. }
  8.  
  9. @Override
  10. public long getItemId(int position) {
  11. return entries.entries[position].ContestEntryId;
  12.  
  13. }
  14.  
  15. @Override
  16. public int getItemPosition(Object object) {
  17. android.support.v4.app.Fragment f = (android.support.v4.app.Fragment)object;
  18. for(int i = 0; i < getCount(); i++){
  19.  
  20. android.support.v4.app.Fragment fragment = getItem(i);
  21. if(f.equals(fragment)){
  22. return i;
  23. }
  24. }
  25. return POSITION_NONE;
  26. }
  27.  
  28.  
  29. @Override
  30. public android.support.v4.app.Fragment getItem(int position) {
  31.  
  32. long entryId = getItemId(position);
  33. //Log.d("EntryIds",Integer.toString(entryId));
  34. if(mItems.get(entryId) != null) {
  35. return mItems.get(entryId);
  36. }
  37. Fragment f = ScreenSlidePageFragment.create(position);
  38. mItems.put(entryId,f);
  39. return f;
  40. }
  41.  
  42. @Override
  43. public int getCount() {
  44. return NUM_PAGES;
  45. }
  46. }

以下是当从服务器发出新的有效负载时我正在使用的内容

  1. @Override
  2. protected void onPostExecute(ContestEntriesModel entries) {
  3. Fragment currentFragment = ContestEntries.mItems.get(ContestEntries.CurrentEntryId);
  4. Log.d("fromUpdate",Long.toString(ContestEntries.CurrentEntryId));
  5. ContestEntries.Entries = entries;
  6. ContestEntries.NUM_PAGES = ContestEntries.Entries.entries.length;
  7. ContestEntries.mPagerAdapter.notifyDataSetChanged();
  8. ContestEntries.mPager.setCurrentItem(ContestEntries.mPagerAdapter.getItemPosition(currentFragment));
  9. }

解决方法

检查 my answer here.关键是覆盖适配器中的getItemId(int)和getItemPosition(Object).

getItemId(int)用于在数据集中唯一标识您的页面. getItemPosition(Object)用于获取数据集中此唯一页面的(更新的)位置.

如果你想保持焦点在同一页上之前和更新(添加/删除页面)后,你应该调用viewpager.setCurrentItem(INT)为您的网页你的适配器上调用.notifyDataSetChanged()后的新位置.

猜你在找的Android相关文章