7

サーバーから渡されたデータからページ (ビュー) のデータを描画する ViewPager をセットアップしました。場合によっては、サーバーが新しいデータを送信してビューを並べ替えたり (場合によっては新しいビューを追加したりします)、ユーザーが現在特定のフラグメントを表示している間に Android デバイスでシームレスにそれを行う必要があります。

新しいデータがサーバーから引き出されたときに notifyDataSetChanged() を呼び出すように設定しましたが、現在表示されているスライドの左右にキャッシュされたバージョンのスライドが保持されているようで、並べ替えによって変更される可能性があります。ここでこのトピックを見てきました: ViewPager PagerAdapter はビューを更新せず、表示されている現在のスライドをリロードする以外は正常に機能する最初のソリューションを実装しましたが、これは私の目的では機能しません。2番目の回答の同じページで提案されている setTag() メソッドの実装について詳しく調べました。これはスライドの情報を更新するのに役立ちますが、並べ替えには役立ちません。

現在表示されているスライドにげっぷを発生させずに、舞台裏ですべてのスライドを並べ替える方法はありますか?

ティア

編集:コードを追加し、さらに明確にするよう求める

これは私のアダプタークラスです。

    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 に答える