7

我有一个 ViewPager 设置,它从服务器传递的数据中为其页面(视图)绘制数据。有时,服务器会发送新数据来重新排序视图(有时会添加新视图),我需要在用户当前查看特定片段时在我的 android 设备上无缝地实现这一点。

我将它设置为在从服务器下拉新数据时调用 notifyDataSetChanged() ,但这似乎将幻灯片的缓存版本保留在当前查看的幻灯片的左侧和右侧,这可能会随着重新排序而改变。我在这里查看了这个主题:ViewPager PagerAdapter not update the View并实现了第一个工作正常的解决方案,除了它重新加载当前正在查看的幻灯片,这对我的目的不起作用。我对第二个答案中同一页面上提出的 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));
    }
4

1 回答 1

6

在这里检查我的答案。关键是在你的适配器中覆盖getItemId(int)和。getItemPosition(Object)

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

如果您想在更新(添加/删除页面)之前和之后始终关注同一页面,则应在调用适配器viewpager.setCurrentItem(int)后调用页面的新位置。.notifyDataSetChanged()

于 2013-06-17T17:16:20.620 回答