Android ViewPager光标位置

Android ViewPager光标位置,android,android-viewpager,Android,Android Viewpager,我正在编写一个简单的新闻应用程序作为学习练习。显示由SQLite光标驱动的listfragment。单击并转到详细信息屏幕。现在正在尝试将详细信息屏幕转换为ViewPager。我不想将光标从listfragment传递到ViewPager活动,因此我将传递光标中的当前位置,然后创建一个新光标。但我似乎没能找到合适的位置。如果我在活动中设置它,而不是在getItem()中设置,它将转到正确的位置,但不会更改。如果我在getItem中设置它,它总是从位置0开始。关键是 // cp.getCursor

我正在编写一个简单的新闻应用程序作为学习练习。显示由SQLite光标驱动的listfragment。单击并转到详细信息屏幕。现在正在尝试将详细信息屏幕转换为ViewPager。我不想将光标从listfragment传递到ViewPager活动,因此我将传递光标中的当前位置,然后创建一个新光标。但我似乎没能找到合适的位置。如果我在活动中设置它,而不是在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(位置)


您说过“我不想将光标从listfragment传递到ViewPager活动”,您能详细说明一下吗?看起来,每次你触摸一个片段并启动活动时,你都必须创建一个新的游标并再次获取数据,这可能会很慢。我在这里读了一篇非常有说服力的文章,因此传递游标是非常危险的——主要是因为它们是在一个上下文中创建的,然后传递给另一个上下文。这里是链接:我将研究做一些类似于该问题答案评论中建议的事情,并在1个活动下完成这些事情,这样您就可以将一个列表绑定到光标上以获取数据,并将一个
viewPager
绑定到同一个实例上,比如说一个不同的片段(与该活动相同的上下文)根据需要在它们之间切换。
 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;
   }
  }