Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在TabView导航期间强制关闭?_Android_Tabs - Fatal编程技术网

Android 在TabView导航期间强制关闭?

Android 在TabView导航期间强制关闭?,android,tabs,Android,Tabs,在“我的活动”中有一个包含3个选项卡的选项卡视图,每个选项卡都有一个列表视图和一个按钮。 当我在emulator上使用D-Pad导航选项卡时,没有问题,但当我使用滚轮(鼠标)导航视图,然后在视图中单击时,会出现强制关闭。我认为这与“touchmodechange”有关,但不确定如何处理。非常感谢你的帮助 12-23 19:14:25.352: ERROR/ActivityThread(116): Failed to find provider info for android.server.ch

在“我的活动”中有一个包含3个选项卡的选项卡视图,每个选项卡都有一个列表视图和一个按钮。 当我在emulator上使用D-Pad导航选项卡时,没有问题,但当我使用滚轮(鼠标)导航视图,然后在视图中单击时,会出现强制关闭。我认为这与“touchmodechange”有关,但不确定如何处理。非常感谢你的帮助

12-23 19:14:25.352: ERROR/ActivityThread(116): Failed to find provider info for android.server.checkin
12-23 19:18:09.184: ERROR/AndroidRuntime(226): Uncaught handler: thread main exiting due to uncaught exception
12-23 19:18:09.224: ERROR/AndroidRuntime(226): java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread.
12-23 19:18:09.224: ERROR/AndroidRuntime(226):     at android.widget.ListView.layoutChildren(ListView.java:1428)
12-23 19:18:09.224: ERROR/AndroidRuntime(226):     at android.widget.AbsListView.onTouchModeChanged(AbsListView.java:1888)
12-23 19:18:09.224: ERROR/AndroidRuntime(226):     at android.view.ViewTreeObserver.dispatchOnTouchModeChanged(ViewTreeObserver.java:591)
12-23 19:18:09.224: ERROR/AndroidRuntime(226):     at android.view.ViewRoot.ensureTouchModeLocally(ViewRoot.java:1877)
12-23 19:18:09.224: ERROR/AndroidRuntime(226):     at android.view.ViewRoot.ensureTouchMode(ViewRoot.java:1861)
12-23 19:18:09.224: ERROR/AndroidRuntime(226):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1652)
12-23 19:18:09.224: ERROR/AndroidRuntime(226):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-23 19:18:09.224: ERROR/AndroidRuntime(226):     at android.os.Looper.loop(Looper.java:123)
12-23 19:18:09.224: ERROR/AndroidRuntime(226):     at android.app.ActivityThread.main(ActivityThread.java:4203)
12-23 19:18:09.224: ERROR/AndroidRuntime(226):     at java.lang.reflect.Method.invokeNative(Native Method)
12-23 19:18:09.224: ERROR/AndroidRuntime(226):     at java.lang.reflect.Method.invoke(Method.java:521)
12-23 19:18:09.224: ERROR/AndroidRuntime(226):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
12-23 19:18:09.224: ERROR/AndroidRuntime(226):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
12-23 19:18:09.224: ERROR/AndroidRuntime(226):     at dalvik.system.NativeStart.main(Native Method)



private void fillData(int tab)
    {
        Cursor cursor;
        Long millis;
        String tempstr;
        //query table and obtain cursor 
        if(tab==0)
            cursor=dbAdapter.getAllRemindersCursor();
        else if(tab==1)
            cursor=dbAdapter.getAutoRemindersCursors();
        else if(tab==2) 
            cursor=dbAdapter.getUserRemindersCursors();
        else
            cursor=dbAdapter.getAllRemindersCursor();

        results.clear();

        //populate the ArrayList using the cursor
        if(cursor!=null)
        {
            if(cursor.moveToFirst())
            {
                Log.d("Msg","Cursor at first item");
                Log.d("Msg",cursor.getCount()+" items in cursor");
                do
                {
                    millis=cursor.getLong(1);
                    tempstr=cursor.getString(2);
                    tempstr=" "+tempstr+"\n"+" "+dtf.format(millis);
                    results.add(tempstr);
                    category.add(cursor.getInt(4));
                    Log.d("Msg","message and type items added");
                }
                while(cursor.moveToNext());
            }
        }
        else
        {
            Log.d("Msg","Cursor is empty");
        }

        if(tab==0)
            lv1.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,results));
        else if(tab==1)
            lv2.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,results));
        else if(tab==2)
            lv3.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,results));
        else
            lv1.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,results));
    }
12-23 19:14:25.352:错误/ActivityThread(116):未能找到android.server.checkin的提供商信息
12-23 19:18:09.184:错误/AndroidRuntime(226):未捕获处理程序:由于未捕获异常,线程主线程正在退出
12-23 19:18:09.224:错误/AndroidRuntime(226):java.lang.IllegalStateException:适配器的内容已更改,但ListView未收到通知。确保适配器的内容不是从后台线程修改的,而是仅从UI线程修改的。
12-23 19:18:09.224:ERROR/AndroidRuntime(226):位于android.widget.ListView.layoutChildren(ListView.java:1428)
12-23 19:18:09.224:ERROR/AndroidRuntime(226):在android.widget.AbsListView.onTouchModeChanged(AbsListView.java:1888)
12-23 19:18:09.224:ERROR/AndroidRuntime(226):在android.view.ViewTreeObserver.dispatchOnTouchModeChanged(ViewTreeObserver.java:591)
12-23 19:18:09.224:ERROR/AndroidRuntime(226):在android.view.ViewRoot.EnsureTouchModelLocal(ViewRoot.java:1877)
12-23 19:18:09.224:ERROR/AndroidRuntime(226):在android.view.ViewRoot.ensureTouchMode(ViewRoot.java:1861)
12-23 19:18:09.224:ERROR/AndroidRuntime(226):在android.view.ViewRoot.handleMessage(ViewRoot.java:1652)上
12-23 19:18:09.224:ERROR/AndroidRuntime(226):位于android.os.Handler.dispatchMessage(Handler.java:99)
12-23 19:18:09.224:ERROR/AndroidRuntime(226):在android.os.Looper.loop(Looper.java:123)上
12-23 19:18:09.224:ERROR/AndroidRuntime(226):位于android.app.ActivityThread.main(ActivityThread.java:4203)
12-23 19:18:09.224:ERROR/AndroidRuntime(226):位于java.lang.reflect.Method.invokenactive(本机方法)
12-23 19:18:09.224:ERROR/AndroidRuntime(226):位于java.lang.reflect.Method.invoke(Method.java:521)
12-23 19:18:09.224:ERROR/AndroidRuntime(226):在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
12-23 19:18:09.224:ERROR/AndroidRuntime(226):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
12-23 19:18:09.224:ERROR/AndroidRuntime(226):在dalvik.system.NativeStart.main(本机方法)
私有void fillData(int选项卡)
{
光标;
长毫;
字符串tempstr;
//查询表并获取游标
如果(制表符==0)
cursor=dbAdapter.getAllMembersCursor();
else if(tab==1)
cursor=dbAdapter.getAutoRemindersCursors();
否则,如果(制表符==2)
cursor=dbAdapter.getUserMembersCursors();
其他的
cursor=dbAdapter.getAllMembersCursor();
结果:清晰();
//使用光标填充ArrayList
如果(光标!=null)
{
if(cursor.moveToFirst())
{
Log.d(“Msg”,“光标位于第一项”);
Log.d(“Msg”,cursor.getCount()+“cursor中的项”);
做
{
millis=游标.getLong(1);
tempstr=cursor.getString(2);
tempstr=“”+tempstr+”\n“+”+dtf.format(毫秒);
结果:添加(tempstr);
category.add(cursor.getInt(4));
Log.d(“添加消息”、“消息和类型项”);
}
while(cursor.moveToNext());
}
}
其他的
{
Log.d(“Msg”,“游标为空”);
}
如果(制表符==0)
setAdapter(新的ArrayAdapter(这个,android.R.layout.simple_list_item_1,results));
else if(tab==1)
setAdapter(新的ArrayAdapter(这个,android.R.layout.simple_list_item_1,results));
否则,如果(制表符==2)
setAdapter(新的ArrayAdapter(这个,android.R.layout.simple_list_item_1,results));
其他的
setAdapter(新的ArrayAdapter(这个,android.R.layout.simple_list_item_1,results));
}
每次触发onTabChangedListener时都会调用此方法。另一方面也有
此活动中目前没有其他内容。

问题是您正在为所有适配器共享相同的
结果。此列表在适配器内部直接引用,因此当您切换选项卡时,您正在更新所有选项卡上的适配器(这就是为什么会出现IllegalStateException)。不用重用results变量,只需在filldata方法中创建一个新变量,就不需要(从上面的代码中可以看出)使用相同的变量。我相信您也可以只使用光标或适配器,而不必麻烦中间列表。

您是否在代码中的任何地方使用onFocusChangedListner?@R.daneel.olivaw实际上目前我使用的是OnTabChangedListener您可以显示您的代码吗。@Pavan More我已将活动的主要功能添加到我的任务中。代码的其余部分只是初始化。如果我错了,请纠正我,但我的数据正在正确更新。如果forceclose的原因是公共ArrayList,那么每次我更改选项卡时都应该发生,但是只有当我使用鼠标滚轮导航,然后单击选项卡中布局中的任何项目时,forceclose才会发生。嗯,我不确定为什么只会在这种情况下发生,但我非常确定您不应该重用该列表。您确实看到您正在所有适配器上设置和更新相同的精确列表,对吗(b/c没有
新列表()
,只有
清除()
)?如果您查看,当您传递一个列表时,它只是被直接使用,没有复制。其思想是,该列表用作临时存储,每次更改选项卡时,结果都被清除,并重新填充