我无法更新ViewPager中的内容.
一个问题:FragmentPagerAdapter类中的方法instantiateItem()和getItem()的关系和正确用法是什么?
我只使用getItem()实例化并返回我的片段:
@Override
public Fragment getItem(int position) {
    return new MyFragment(context, paramters);
}
这很好用(但据说我不能改变内容).
所以我发现了这个:ViewPager PagerAdapter没有更新View
特别是在其中讨论了方法instantiateItem():
"我的方法是对instantiateItem()方法中的任何实例化视图使用setTag()方法"
所以现在我想实现instantiateItem()才能做到这一点.但我不知道我必须返回那里(return是Object)和getItem(int position)的关系是什么?
目前我正在使用getItem来实例化Fragment,这是错的吗?但是,我是否必须将片段放在实例变量中,或者根本不实现getItem()......?我只是不明白.
我试过阅读参考资料:
public abstract Fragment getItem(int position)
返回与指定位置关联的片段.
public Object instantiateItem(ViewGroup容器,int位置)
创建给定位置的页面.适配器负责将视图添加到此处给出的容器,但它必须确保在从finishUpdate(ViewGroup)返回时完成此操作.参数
容器包含将在其中显示页面的View.position要实例化的页面位置.
返回
返回表示新页面的Object.这不需要是View,但可以是页面的其他容器.
......但我仍然不明白它们是如何相关的以及我必须做些什么.
这是我的代码.我正在使用支持包v4.
ViewPagerTest
public class ViewPagerTest extends FragmentActivity {
    private ViewPager pager;
    private MyFragmentAdapter adapter; 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.pager1);
        pager = (ViewPager)findViewById(R.id.slider);
        String[] data = {"page1", "page2", "page3", "page4", "page5", "page6"};
        adapter = new MyFragmentAdapter(getSupportFragmentManager(), 6, this, …(我想出了一个解决方案 - 请在下面的答案部分看到我的帖子.)
在我的应用程序中,用户将从他的数据的单个视图开始.我想添加一个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);      
}
使用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, …我ViewPager用于刷卡之间Fragments,但我可以使用ViewPager在Views简单的XML布局之间滑动吗?
这是AdapterViewPager的页面,用于在片段之间滑动:
import java.util.List;
import com.app.name.fragments.TipsFragment;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.FragmentTransaction;
import android.view.ViewGroup;
public class PageAdapter extends FragmentPagerAdapter {
    /**
     *
     */
    List<Fragment> fragments;
    public PageAdapter(FragmentManager fm,List<Fragment> frags) {
        super(fm);
        fragments = frags;
    }
    @Override
    public Fragment getItem(int arg0) {
        // TODO Auto-generated method stub
        return TipsFragment.newInstance(0, 0);
    }
    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return 4;
    }
    @Override
    public void destroyItem(ViewGroup container, …我ViewPager用来允许用户在其视图之间滑动.有没有办法如何强制它ViewPager重新加载/重新实例化它们的视图,以防它们不再有效或需要刷新?我试图调用notifyDataSetChanged()它的适配器,但这不会instantiateItem()再次调用方法.
这是从ViewPager及其适配器定义扩展的类.Bellow是refresh()我想要强制刷新项目时调用的方法.
public class DayFlipper extends ViewPager {
public class FlipperAdapter extends PagerAdapter {
    @Override
    public int getCount() {
        return DayFlipper.DAY_HISTORY;
    }
    @Override
    public void startUpdate(View container) {
    }
    @Override
    public Object instantiateItem(View container, int position) {
        Log.d(TAG, "instantiateItem(): " + position);
        Date d = DateHelper.getBot();
        for (int i = 0; i < position; i++) {
            d = DateHelper.getTomorrow(d);
        }
        d = DateHelper.normalize(d);
        CubbiesView cv = new CubbiesView(mContext);
        cv.setLifeDate(d); …我们在这里遇到了一个非常奇怪的ViewPager问题.我们在每个ViewPager页面上嵌入了列表,并在更新列表数据时在列表适配器和视图寻呼机适配器上触发notifyDataSetChanged.
我们观察到的是,有时候,页面不会更新其视图树,即保持空白,或者有时甚至在分页时消失.来回寻呼几次时,内容会突然重新出现.似乎Android在这里缺少视图更新.我还注意到,在使用层次结构查看器进行调试时,选择一个视图将始终使其重新出现,这显然是因为层次结构查看器强制所选视图重绘自身.
我不能以编程方式完成这项工作; 使列表视图无效,甚至整个视图寻呼机都无效.
这与compatibility-v4_r7库有关.我也尝试使用最新版本,因为它声称修复了与查看寻呼机相关的许多问题,但它更糟糕的是(例如,手势被打破,以至于它不会让我不再遍历所有页面.)
是否还有其他人遇到这些问题,或者您是否知道可能导致此问题的原因?
我有一个MainActivity.在这里String我有两个Fragment A,我在xml中以声明方式创建.
我试图Fragment B将用户输入的文本传递getActivity()到文本视图中MainActivity.然而,事实证明这非常困难.有谁知道我怎么做到这一点?
我知道片段可以使用它来获取对它的活动的引用String.所以我猜我会从那里开始?
我有一个FragmentPagerAdapter.它的getItem方法可以根据它从外部获得的数据返回一个片段.在我更新数据后,它假设显示我打电话notifyDataSetChanged但没有任何反应.我DID覆盖getItemPosition返回的方法POSITION_NONE:
public static class TabsAdapter extends FragmentPagerAdapter implements TabHost.OnTabChangeListener,
        ViewPager.OnPageChangeListener
{
    private final Context mContext;
    private final TabHost mTabHost;
    private final ViewPager mViewPager;
    private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
    private PagerTabsFragments fragmentDisplayInfo = null; // for now only a
                                                            // single size
                                                            // back
                                                            // stack
    static class PagerTabsFragments
    {
        public int tabPosition;
        public Fragment fragmentToDisplay;
        public Object fragmentInfo;
        public PagerTabsFragments(int tab, Fragment frag, Object info)
        {
            tabPosition = tab;
            fragmentToDisplay …android android-adapter fragmentpageradapter notifydatasetchanged
我相信当重写getItemPosition(Object object)以重新排序页面时,FragmentStatePagerAdapter的行为不正确.
下面是一个简单的例子.在初始状态中,页面的顺序是{A,B,C}.在呼叫时toggleState(),页面的顺序变为{A,C,B}.通过覆盖getItemPosition(Object object),我们确保正在查看的当前页面(A,B或C)不会更改.
public static class TestPagerAdapter extends FragmentStatePagerAdapter {
    private boolean mState = true;
    public TestPagerAdapter(FragmentManager fragmentManager) {
        super(fragmentManager);
    }
    @Override
    public int getCount() {
        return 3;
    }
    private void toggleState() {
        mState = !mState;
        notifyDataSetChanged();
    }
    private String getLabel(int position) {
        switch (position) {
            case 0:
                return "A";
            case 1:
                return mState ? "B" : "C";
            default:
                return mState ? "C" : "B";
        }
    }
    @Override
    public int getItemPosition(Object object) { …我有viewPager2和FragmentStateAdapter,还有Fragement1,2,3 4,我在fragment2,想去掉fragment3,在fragment2后显示fragment4。问题是它总是向我显示 fragment3(data),调试显示 fragment3 已被删除,但显示的页面仍然有 fragment3 内容。
适配器:
class TipsAdapter(
private val items: MutableList<TripPage>,
context: FragmentActivity
) : FragmentStateAdapter(context) {
private val fragmentFactory = context.supportFragmentManager.fragmentFactory
private val classLoader = context.classLoader
override fun getItemCount(): Int = items.size
override fun createFragment(position: Int): Fragment {
    val pageInfo = items[position]
    val fragment = fragmentFactory.instantiate(classLoader, pageInfo.fragmentClass.name)
    fragment.arguments = Bundle().also { it.putParcelable(PAGE_INFO, pageInfo) }
    return fragment
}
fun getFragmentName(position: Int) = items[position].fragmentClass.simpleName
fun removeFragment(position: Int) {
    items.removeAt(position)
    notifyItemRemoved(position)
    notifyItemRangeChanged(position, items.size)
    notifyDataSetChanged()
}
}
删除片段代码:
      if ((view_pager.adapter …android android-viewpager fragmentstatepageradapter android-viewpager2
我创建了一个FragmentStatePagerAdapter用于提供小型图库的活动.但是,当活动恢复时(例如,从其他活动返回后),我无法刷新它.每次前两张图片都是空白的,只有在我将两张图片刷到一边后,它们才会刷新.我找到的答案都没有起作用(特别是压倒一切getItemPosition())
我这样设置:
mPagerAdapter = new PhotosPagerAdapter(getSupportFragmentManager());
mPager = (ViewPager) findViewById(R.id.photosViewPager);
mPager.setAdapter(mPagerAdapter);
然后我有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;
    }
}
您可能已经注意到,我在getItemPosition中抛出RuntimeException,因为我想检查它何时被调用.直到我添加一些包含我的图片的列表才会调用它.然后是ImageFragment类:
public class ImageFragment extends Fragment{
    int position;
    Bitmap mBitmap;
    int width;
    int height;
    ImageView img;
    public ImageFragment(){ …android android-fragments android-viewpager fragmentpageradapter