我正在使用兼容性库中的 ViewPager。我已经成功地让它显示了几个可以翻页的视图。
但是,我很难弄清楚如何用一组新的视图更新 ViewPager。
我已经尝试了各种方法,例如 call mAdapter.notifyDataSetChanged(),mViewPager.invalidate()甚至每次我想使用新的数据列表时都创建一个全新的适配器。
mAdapter.notifyDataSetChanged()
mViewPager.invalidate()
没有任何帮助,文本视图与原始数据保持不变。
更新: 我做了一个小测试项目,我几乎能够更新视图。我将粘贴下面的课程。
然而,似乎没有更新的是第二个视图,“B”仍然存在,按下更新按钮后它应该显示“Y”。
public class ViewPagerBugActivity extends Activity { private ViewPager myViewPager; private List<String> data; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); data = new ArrayList<String>(); data.add("A"); data.add("B"); data.add("C"); myViewPager = (ViewPager) findViewById(R.id.my_view_pager); myViewPager.setAdapter(new MyViewPagerAdapter(this, data)); Button updateButton = (Button) findViewById(R.id.update_button); updateButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { updateViewPager(); } }); } private void updateViewPager() { data.clear(); data.add("X"); data.add("Y"); data.add("Z"); myViewPager.getAdapter().notifyDataSetChanged(); } private class MyViewPagerAdapter extends PagerAdapter { private List<String> data; private Context ctx; public MyViewPagerAdapter(Context ctx, List<String> data) { this.ctx = ctx; this.data = data; } @Override public int getCount() { return data.size(); } @Override public Object instantiateItem(View collection, int position) { TextView view = new TextView(ctx); view.setText(data.get(position)); ((ViewPager)collection).addView(view); return view; } @Override public void destroyItem(View collection, int position, Object view) { ((ViewPager) collection).removeView((View) view); } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public Parcelable saveState() { return null; } @Override public void restoreState(Parcelable arg0, ClassLoader arg1) { } @Override public void startUpdate(View arg0) { } @Override public void finishUpdate(View arg0) { } } }
有几种方法可以实现这一点。
第一种选择更容易,但效率更低。
像这样覆盖getItemPosition你PagerAdapter:
getItemPosition
PagerAdapter
public int getItemPosition(Object object) { return POSITION_NONE; }
这样,当您调用 时notifyDataSetChanged(),视图寻呼机将删除所有视图并重新加载它们。这样就获得了重装效果。
notifyDataSetChanged()
第二个选项,由 Alvaro Luis Bustamante (previously alvarolb) 建议,是在实例化新视图时使用setTag()方法。instantiateItem()然后notifyDataSetChanged(),您可以使用findViewWithTag()来查找要更新的视图,而不是使用。
setTag()
instantiateItem()
findViewWithTag()
第二种方法非常灵活和高性能。感谢 alvarolb 的原创研究。