相关疑难解决方法(0)

ViewPager PagerAdapter未更新视图

我正在使用兼容性库中的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)

android android-viewpager

581
推荐指数
14
解决办法
35万
查看次数

动态更新ViewPager?

我无法更新ViewPager中的内容.

一个问题:FragmentPagerAdapter类中的方法instantiateItem()和getItem()的关系和正确用法是什么?

我只使用getItem()实例化并返回我的片段:

@Override
public Fragment getItem(int position) {
    return new MyFragment(context, paramters);
}
Run Code Online (Sandbox Code Playgroud)

这很好用(但据说我不能改变内容).

所以我发现了这个: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, …
Run Code Online (Sandbox Code Playgroud)

android android-fragments android-viewpager

303
推荐指数
7
解决办法
26万
查看次数

java.lang.IllegalArgumentException:观察者为null

我的某个应用的用户报告了此错误.我很困惑如何修复它意味着什么.经过一番谷歌搜索......仍然没有运气.以前见过这个或者知道如何解决它的人?

java.lang.IllegalArgumentException: The observer is null.
at android.database.Observable.unregisterObserver(Observable.java:59)
at android.widget.BaseAdapter.unregisterDataSetObserver(BaseAdapter.java:42)
at android.widget.HeaderViewListAdapter.unregisterDataSetObserver(HeaderViewListAdapter.java:256)
at android.widget.AbsListView.onDetachedFromWindow(AbsListView.java:2309)
at android.view.View.dispatchDetachedFromWindow(View.java:8197)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1968)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1966)
at android.view.ViewGroup.removeViewInternal(ViewGroup.java:3257)
at android.view.ViewGroup.removeViewInternal(ViewGroup.java:3237)
at android.view.ViewGroup.removeView(ViewGroup.java:3185)
at com.aheudev.a.slickdeals.adapters.DealPageAdapter.destroyItem(DealPageAdapter.java:174)
at android.support.v4.view.ViewPager.populate(ViewPager.java:415)
at android.support.v4.view.ViewPager.completeScroll(ViewPager.java:696)
at android.support.v4.view.ViewPager.computeScroll(ViewPager.java:668)
at android.view.ViewGroup.drawChild(ViewGroup.java:2434)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2189)
at android.view.View.draw(View.java:9282)
at android.view.ViewGroup.drawChild(ViewGroup.java:2584)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2189)
at android.view.ViewGroup.drawChild(ViewGroup.java:2582)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2189)
at android.view.ViewGroup.drawChild(ViewGroup.java:2582)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2189)
at android.view.View.draw(View.java:9282)
at android.widget.FrameLayout.draw(FrameLayout.java:419)
at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1923)
at android.view.ViewRoot.draw(ViewRoot.java:1695)
at android.view.ViewRoot.performTraversals(ViewRoot.java:1410)
at android.view.ViewRoot.handleMessage(ViewRoot.java:2040)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:132)
at android.app.ActivityThread.main(ActivityThread.java:4123)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:491)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
at …
Run Code Online (Sandbox Code Playgroud)

java android android-viewpager

10
推荐指数
1
解决办法
1万
查看次数

ViewPager + PagerAdapter在前两个项目后显示空白页面

发生了什么:前两个ViewPager页面加载得很好(ViewPager自动从当前页面加载+ -1).当您滚动浏览这些页面时,下一页面不会显示.以下问题的GIF演示.

调试信息:该页面被实例化(见下面的代码),并成功添加到ViewPager ArrayList<ItemInfo>mItems(通过日志消息确认).我android.support.v4用debug = true set(mmm frameworks/support/v4/在aosp中)重新编译了库,它显示了一切正常工作除了:

加载前两个视图后,将停止调用ViewPager中的onLayout和onMeasure方法.这意味着其他页面是黑色的,因为它们从未被测量和安排,因为它们应该是.我尝试在不同的点添加不同的requestLayout()调用以强制布局树刷新无效.

背景:我有一个通过inflater.inflate实例化的ViewPager,通过view.findViewById(R.layouy.myid)找到.它直接替换旧的Gallery视图,为了测试目的,PagerAdapter instantiateItem(集合,位置)只是这样做:

@Override
public Object instantiateItem(View collection, final int position) {
    final TextView tv = new TextView(collection.getContext());
    tv.setText("Looking at page " + position);
    tv.setTextColor(Color.WHITE);
    tv.setBackgroundColor(Color.rgb( (int)(Math.random()*100), (int)(Math.random()*100), (int)(Math.random()*100)));
    tv.setTextSize(22);
    ((ViewPager) collection).addView(tv);
    return tv;
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?在我看来,像PageView的父母的一些神秘设置在某种程度上禁用onLayout PageView

android android-viewpager

6
推荐指数
1
解决办法
7544
查看次数