动态将项目添加到FragmentGridPagerAdapter

罗宾·艾森伯格

我正在尝试显示具有4个条目的FragmentGridPagerAdapter,并且当视图滚动时,我想向适配器添加项目。

这是我的FragmentPagerAdapter:

public class MyPagerAdapter extends FragmentGridPagerAdapter {

private final Context _ctx;
private HashMap<Integer, Entry> _data;

public MyPagerAdapter(Context context, FragmentManager fm, HashMap<Integer, Entry> tidatals) {
    super(fm);
    _ctx = context;
    _data = data;
}

public void addEntry(Entry entry)
{
    _data.put(_data.size(), entry);
    this.notifyDataSetChanged();
}


@Override
public Fragment getFragment(int i, int i2) {

    CardFragment fragment = CardFragment.create("Card", _data.get(i).getPrettyText());
    fragment.setCardGravity(Gravity.BOTTOM);
    fragment.setExpansionEnabled(true);
    return fragment;
}

@Override
public int getRowCount() {
    return _data.size();
}

@Override
public int getColumnCount(int i) {
    return 1;
}

}

这就是我如何在“主要磨损活动”中将数据添加到适配器的方法:

//In onCreate: 
    _data = new HashMap<Integer, Entry>();
    _adapter = new TILPagerAdapter(this, getFragmentManager(), _data);
    _pager.setAdapter(_adapter);

//When I finally get my data:
...
// Do stuff, get datas in 'data' variable
MainWear.this.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                 boolean firstData = _data.isEmpty();
                for(TILEntry entry : data.values())
                {
                    _adapter.addEntry(entry);
                }
                if(firstData){
                    _pager.setAdapter(_adapter);
                    switchViewToResults(); // Sets pager to visible
                }
            }
        });

当我将项目添加到适配器中并调用notifyDataSetChanged()时,适配器会刷新正常,但是当我滚动到添加的页面时会崩溃。

这是堆栈跟踪:

E/InputEventReceiver﹕ Exception dispatching input event.
E/MessageQueue-JNI﹕ Exception in MessageQueue callback: handleReceiveCallback
E/MessageQueue-JNI﹕ java.lang.ArrayIndexOutOfBoundsException: length=4; index=4
            at android.support.wearable.view.GridViewPager.populate(GridViewPager.java:873)
            at android.support.wearable.view.GridViewPager.setCurrentItemInternal(GridViewPager.java:584)
            at android.support.wearable.view.GridViewPager.handlePointerUp(GridViewPager.java:1990)
            at android.support.wearable.view.GridViewPager.onTouchEvent(GridViewPager.java:1492)
            at android.view.View.dispatchTouchEvent(View.java:7846)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2209)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1944)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2215)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1958)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2215)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1958)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2215)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1958)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2215)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1958)
            at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2085)
            at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1532)
            at android.app.Activity.dispatchTouchEvent(Activity.java:2468)
            at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2033)
            at android.view.View.dispatchPointerEvent(View.java:8026)
            at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3989)
            at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3868)
            at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3433)
            at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3483)
            at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3452)
            at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3559)
            at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3460)
            at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3616)
            at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3433)
            at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3483)
            at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3452)
            at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3460)
            at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3433)
            at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5589)
            at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5569)
            at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5540)
            at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5669)
            at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
            at android.os.MessageQueue.nativePollOnce(Native Method)
            at android.os.MessageQueue.next(MessageQueue.java:138)
            at android.os.Looper.loop(Looper.java:123)
            at android.app.ActivityThread.main(ActivityThread.java:5026)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
            at dalvik.system.NativeStart.main(Native Method)
D/AndroidRuntime﹕ Shutting down VM
W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0xadb04d70)
E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: til.wear.robineisenberg.til_wear, PID: 5808
    java.lang.ArrayIndexOutOfBoundsException: length=4; index=4
            at android.support.wearable.view.GridViewPager.populate(GridViewPager.java:873)
            at android.support.wearable.view.GridViewPager.setCurrentItemInternal(GridViewPager.java:584)
            at android.support.wearable.view.GridViewPager.handlePointerUp(GridViewPager.java:1990)
            at android.support.wearable.view.GridViewPager.onTouchEvent(GridViewPager.java:1492)
            at android.view.View.dispatchTouchEvent(View.java:7846)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2209)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1944)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2215)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1958)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2215)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1958)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2215)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1958)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2215)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1958)
            at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2085)
            at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1532)
            at android.app.Activity.dispatchTouchEvent(Activity.java:2468)
            at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2033)
            at android.view.View.dispatchPointerEvent(View.java:8026)
            at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3989)
            at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3868)
            at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3433)
            at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3483)
            at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3452)
            at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3559)
            at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3460)
            at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3616)
            at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3433)
            at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3483)
            at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3452)
            at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3460)
            at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3433)
            at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5589)
            at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5569)
            at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5540)
            at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5669)
            at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
            at android.os.MessageQueue.nativePollOnce(Native Method)
            at android.os.MessageQueue.next(MessageQueue.java:138)
            at android.os.Looper.loop(Looper.java:123)
            at android.app.ActivityThread.main(ActivityThread.java:5026)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
            at dalvik.system.NativeStart.main(Native Method)

我在调用getFragment时打印了_data大小,在Adapter中,当调用getFragment时_data.size()的值正确为8。

在日志中,4是初始适配器大小的大小。之后,8是所需的大小。它不会在添加项目时崩溃,而只会在滚动显示卡至新项目时崩溃。我究竟做错了什么?

编辑:确实,这似乎是适配器的notifyDataSetChanged函数中的遗漏。我打开了一个带有Google的错误报告,如果您认为需要解决此问题,请给它加注星标:

https://code.google.com/p/android/issues/detail?id=73846&thanks=73846&ts=1405945122

马蒂阿什

873行GridViewPager.populate()是这样的:

    this.mRowScrollX[row] = computePageLeft(...);

mRowScroll设置适配器时,数组的长度看起来是固定的,而从启动getRowCount()时起不会更新notifyDataSetChanged()确实,如果检查GridViewPager该类的其余部分,您会看到它仅在setAdapter()方法中分配

    this.mExpectedRowCount = this.mAdapter.getRowCount();
    this.mRowScrollX = new int[this.mExpectedRowCount];

简而言之,我认为这是中的错误GridViewPagersetAdapter()只要您想更新行数或列数,都可以通过再次调用来解决。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

动态将项目添加到MDL菜单

来自分类Dev

动态将项目添加到HTML列表

来自分类Dev

动态将项目添加到Magnific Popup画廊

来自分类Dev

如何将项目动态添加到WrapPanel?

来自分类Dev

Swift OSX将项目动态添加到滚动列表

来自分类Dev

动态将项目添加到JComboBox(值+图标= jlabel)

来自分类Dev

如何使用QSqlQueryModel将项目动态添加到QComboBox

来自分类Dev

将项目添加到动态绑定的下拉列表中

来自分类Dev

使用Groovy将WSDL动态添加到项目中

来自分类Dev

Swift OSX将项目动态添加到滚动列表

来自分类Dev

将项目动态添加到 WPF 列表框

来自分类Dev

将项目动态添加到网格 WPF

来自分类Dev

将项目动态添加到Sitecore-项目名称必须符合格式

来自分类Dev

动态将组件添加到RecyclerView

来自分类Dev

动态将行添加到DataTable

来自分类Dev

动态将数据添加到表

来自分类Dev

动态将行添加到datagridview

来自分类Dev

动态将元素添加到数组

来自分类Dev

动态将imageviews添加到listview

来自分类Dev

动态将SubMenuItems添加到SubMenu

来自分类Dev

将动态对象添加到Firestore

来自分类Dev

动态将ReferrerPolicy添加到IFrame

来自分类Dev

动态将变量添加到URL

来自分类Dev

将动态视图添加到RalativeLayout

来自分类Dev

动态将数据添加到列

来自分类Dev

动态将数据添加到MyTableModel

来自分类Dev

将动态视图添加到UIScrollView

来自分类Dev

将动态对象添加到 json

来自分类Dev

将 maxfiles 动态添加到 dropzone