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

时间:2013-06-17 17:03:42

标签: android android-viewpager fragmentpageradapter android-pageradapter

我有一个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));
    }

1 个答案:

答案 0 :(得分:6)

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

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

如果您希望在更新(添加/删除页面)之前和之后将注意力集中在同一页面上,则应在调用适配器上的viewpager.setCurrentItem(int)后调用.notifyDataSetChanged()以获取页面的新位置。