我正在使用兼容性库中的ViewPager.我已经巧妙地让它显示了几个我可以翻阅的视图.
但是,我很难弄清楚如何使用一组新视图更新ViewPager.
我已经试过各种事情就像调用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 …
Run Code Online (Sandbox Code Playgroud) 我使用的是ViewPager
连同FragmentStatePagerAdapter
主办三个不同的片段:
当我想Fragment1
从ViewPager
在FragmentActivity
.
有什么问题,我该如何解决?
(我想出了一个解决方案 - 请在下面的答案部分看到我的帖子.)
在我的应用程序中,用户将从他的数据的单个视图开始.我想添加一个ViewPager,并允许用户根据需要添加更多视图.我该怎么做呢?(我不想使用FragmentPagerAdapter.)
我已经阅读了无数的帖子和概述,但我仍然遗漏了一些东西.这是我认为我理解的:
MainActivity创建一个ViewPager和PagerAdapter:
ViewPager pager = null;
MainPagerAdapter adapter = null;
public void onCreate (Bundle savedInstanceState)
{
super.onCreate (savedInstanceState);
pager = new ViewPager (this);
setContentView (pager);
adapter = new MainPagerAdapter();
pager.setAdapter (adapter);
View v0 = code_to_create_initial_view();
adapter.add (v0, 0);
}
Run Code Online (Sandbox Code Playgroud)
使用PagerAdapter提供视图集.为此,我似乎需要添加和删除视图的方法,就像这样; 显然需要更多的东西来告诉ViewPager的内容已经改变以及如何显示更改:
class MainPagerAdapter extends PagerAdapter
{
// This holds all the currently displayable views, in order from left to right.
private ArrayList<View> views = new ArrayList<View>();
public void addView (View v, int position)
{
views.add (position, …
Run Code Online (Sandbox Code Playgroud) 我们在这里遇到了一个非常奇怪的ViewPager问题.我们在每个ViewPager页面上嵌入了列表,并在更新列表数据时在列表适配器和视图寻呼机适配器上触发notifyDataSetChanged.
我们观察到的是,有时候,页面不会更新其视图树,即保持空白,或者有时甚至在分页时消失.来回寻呼几次时,内容会突然重新出现.似乎Android在这里缺少视图更新.我还注意到,在使用层次结构查看器进行调试时,选择一个视图将始终使其重新出现,这显然是因为层次结构查看器强制所选视图重绘自身.
我不能以编程方式完成这项工作; 使列表视图无效,甚至整个视图寻呼机都无效.
这与compatibility-v4_r7库有关.我也尝试使用最新版本,因为它声称修复了与查看寻呼机相关的许多问题,但它更糟糕的是(例如,手势被打破,以至于它不会让我不再遍历所有页面.)
是否还有其他人遇到这些问题,或者您是否知道可能导致此问题的原因?
我正在使用Jake的ViewPageIndicator,并希望像滑动图库一样显示图像.我可以开始的任何推荐链接.我已经实现了基本的viewpager,现在想要实现图像视图,如下所示
是否可以使用ViewPageIndicator实现?
我想允许用户ViewPager
仅从右向左滑动.因此,一旦他通过一个页面,他就无法回到它.如何才能做到这一点?
我试过这个解决方案:
public class CustomViewPager extends ViewPager {
float lastX = 0;
boolean lockScroll = false;
public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomViewPager(Context context) {
super(context);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
lastX = ev.getX();
lockScroll = false;
return super.onTouchEvent(ev);
case MotionEvent.ACTION_MOVE:
if (lastX > ev.getX()) {
lockScroll = false;
} else {
lockScroll = true;
}
lastX = ev.getX();
break;
}
lastX = ev.getX();
if(lockScroll) …
Run Code Online (Sandbox Code Playgroud) 我正在使用这个例子使用FragmentStatePagerAdapter .
MyAdapter类实现如下:
public static class MyAdapter extends FragmentStatePagerAdapter {
public MyAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return NUM_ITEMS;
}
@Override
public Fragment getItem(int position) {
return ArrayListFragment.newInstance(position);
}
}
Run Code Online (Sandbox Code Playgroud)
ListFragment类包含以下创建新实例的方法:
/**
* Create a new instance of CountingFragment, providing "num"
* as an argument.
*/
static ArrayListFragment newInstance(int num) {
ArrayListFragment f = new ArrayListFragment();
// Supply num input as an argument.
Bundle args = new Bundle();
args.putInt("num", num);
f.setArguments(args);
return f;
} …
Run Code Online (Sandbox Code Playgroud) 我创建了一个FragmentStatePagerAdapter
用于提供小型图库的活动.但是,当活动恢复时(例如,从其他活动返回后),我无法刷新它.每次前两张图片都是空白的,只有在我将两张图片刷到一边后,它们才会刷新.我找到的答案都没有起作用(特别是压倒一切getItemPosition()
)
我这样设置:
mPagerAdapter = new PhotosPagerAdapter(getSupportFragmentManager());
mPager = (ViewPager) findViewById(R.id.photosViewPager);
mPager.setAdapter(mPagerAdapter);
Run Code Online (Sandbox Code Playgroud)
然后我有FragmentStatePagerAdapter类:
private class PhotosPagerAdapter extends FragmentStatePagerAdapter{
public PhotosPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return photos.size();
}
@Override
public Fragment getItem(int position) {
ImageFragment f = new ImageFragment(position);
return f;
}
@Override
public int getItemPosition(Object object) {
throw new RuntimeException();
//return POSITION_NONE;
}
}
Run Code Online (Sandbox Code Playgroud)
您可能已经注意到,我在getItemPosition中抛出RuntimeException,因为我想检查它何时被调用.直到我添加一些包含我的图片的列表才会调用它.然后是ImageFragment类:
public class ImageFragment extends Fragment{
int position;
Bitmap mBitmap;
int width;
int height;
ImageView img;
public ImageFragment(){ …
Run Code Online (Sandbox Code Playgroud) android android-fragments android-viewpager fragmentpageradapter
我有2个标签名为tab1(home)和tab2(profile)使用TabPageIndicator
和FragmentPagerAdapter
库.
在tab2中,我有一个名为"登录"的按钮(tab2膨胀abc.xml
).
当用户单击"登录"按钮时,应用程序将在新活动中显示登录表单.登录后,活动结束,tab2的内容视图将更改(它显示用户的个人资料,因为它会膨胀xyz.xml
).我怎样才能做到这一点?
public class MainActivity extends SherlockFragmentActivity {
private static String[] TAB_NAMES = null;
private Context context = this;
private static FragmentPagerAdapter adapter ;
@Override
protected void onCreate(Bundle savedInstanceState) {
if (TAB_NAMES == null) {
TAB_NAMES = new String[] {
getResources().getString(R.string.tab_home),
getResources().getString(R.string.tab_profile) };
}
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
adapter = new TabsAdapter(
getSupportFragmentManager());
ViewPager pager = (ViewPager) findViewById(R.id.pager);
pager.setAdapter(adapter);
TabPageIndicator indicator = (TabPageIndicator) findViewById(R.id.indicator);
indicator.setViewPager(pager);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater …
Run Code Online (Sandbox Code Playgroud) 我有PageAdapter
一周中的几天,对于每个寻呼机,我有相同的布局.我的问题是如何在更改日期时更新正确的listView.当我改变传呼机创建新的寻呼机并删除其他时,当发生这种情况时,我的列表视图指向新寻呼机而不是当前.例如,在wedneyday我保存列表视图的参考,当我在星期二改变周一寻呼机是创建和周四被删除,我的参考点,以最后一页创建(星期一),但我在星期二.
我的页面适配器:
ListView lvwConfig;
@Override
public Object instantiateItem(View pager, int position) {
LayoutInflater inflater = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflater.inflate(R.layout.pager_layout, null);
lvwConfig = (ListView) v.findViewById(R.id.lvwConfig);
((ViewPager) pager).addView(v, 0);
return v;
}
Run Code Online (Sandbox Code Playgroud)
我想ListView
总是指向当前项目的listview.