1

学習課題として簡単なニュース アプリを作成しています。SQLite カーソルによって駆動されるリストフラグメントを表示します。クリックで詳細画面へ。詳細画面をViewPagerに変換しようとしています。Listfragment から ViewPager アクティビティに Cursor を渡したくないので、代わりにカーソルの現在位置を渡し、新しい Cursor を作成します。なかなかポジションが決まらないようですが。getItem() ではなくアクティビティに設定すると、正しい位置に移動しますが、変更されることはありません。getItem で設定すると、常に位置 0 から始まります。重要な行は次のとおりです。

// cp.getCursor().moveToPosition(mStartPosition);
// cp.notifyDataSetChanged();

助けてくれてありがとう。

  public class ViewPagerActivity extends FragmentActivity {

    private static final int NUM_PAGES = 5;

    private static String mSectionSelected = "";
    private static int mStartPosition;

    private ViewPager mPager;
    private PagerAdapter mPagerAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.view_pager);

        // Instantiate a ViewPager and a PagerAdapter.

        mSectionSelected = (String)this.getIntent().getSerializableExtra("SECTION");

        mPager = (ViewPager) this.findViewById(R.id.pager);
        CursorPagerAdapter cp = new CursorPagerAdapter( getSupportFragmentManager(), mSectionSelected);
        mPager.setAdapter(cp);
       // cp.getCursor().moveToPosition(mStartPosition);
       // cp.notifyDataSetChanged();
    }

    @Override
    public void onBackPressed() {
        if (mPager.getCurrentItem() == 0) {
            // If the user is currently looking at the first step, allow the system to handle the
            // Back button. This calls finish() on this activity and pops the back stack.
            super.onBackPressed();
        } else {
            // Otherwise, select the previous step.
            mPager.setCurrentItem(mPager.getCurrentItem() - 1);
        }
    }
 }

そして、これがアダプターです - キーラインは cursor.moveToPosition(position);

 public class CursorPagerAdapter extends FragmentStatePagerAdapter  {

private Cursor cursor;
private static String mSectionSelected;

public CursorPagerAdapter(FragmentManager fm,  String mSection) {
    super(fm);

    mSectionSelected = mSection;
    this.cursor = NewsManager.get(ApplicationContext.getInstance()).queryNews(mSectionSelected);

}


@Override
public PagerDetailFragment getItem(int position) {
    if (cursor == null) // shouldn't happen
        return null;

    cursor.moveToPosition(position);

    PagerDetailFragment frag;
    try {
        frag = PagerDetailFragment.newInstance();
        String mTitle = cursor.getString(NewsDatabaseHelper.COLNUM_TITLE);
        String mSection = cursor.getString(NewsDatabaseHelper.COLNUM_CATEGORY);
        String mSource = cursor.getString(NewsDatabaseHelper.COLNUM_SOURCE);
        String mPublishedDate = cursor.getString(NewsDatabaseHelper.COLNUM_PUBLISHDATE);
        String mThumbnail = cursor.getString(NewsDatabaseHelper.COLNUM_THUMBNAIL);
        String mBody = cursor.getString(NewsDatabaseHelper.COLNUM_CONTENT);
        Bundle args = new Bundle();
        args.putString(NewsDatabaseHelper.COLUMN_TITLE, mTitle);
        args.putString(NewsDatabaseHelper.COLUMN_CATEGORY, mSection);
        args.putString(NewsDatabaseHelper.COLUMN_SOURCE, mSource);

        args.putString(NewsDatabaseHelper.COLUMN_PUBLISHDATE, mPublishedDate);
        args.putString(NewsDatabaseHelper.COLUMN_THUMBNAIL, mThumbnail);
        args.putString(NewsDatabaseHelper.COLUMN_CONTENT, mBody);
        frag.setArguments(args);
    } catch (Exception ex) {
        throw new RuntimeException(ex);
    }
    return frag;
}

 @Override
 public int getCount() {
    if (cursor == null)
        return 0;
    else
        return cursor.getCount();
}

  public void swapCursor(Cursor c) {
    if (cursor == c)
        return;

    this.cursor = c;
      notifyDataSetChanged();
}

  public Cursor getCursor() {
    return cursor;
   }
  }
4

0 に答える 0