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