Принудительно закрыть во время навигации по TabView? - PullRequest
0 голосов
/ 23 декабря 2011

В моей деятельности есть TabView с 3 вкладками, каждая вкладка имеет ListView и кнопку. Когда я перемещаюсь по вкладкам с помощью D-Pad на эмуляторе, проблем не возникает, но когда я использую колесо прокрутки (мышь) для навигации по представлению и затем нажимаю в представлении, появляется ForceClose. Я думаю, что это как-то связано с «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));
    }

Этот метод вызывается каждый раз, когда срабатывает onTabChangedListener. Другие мудрые есть больше ничего в настоящее время в этой деятельности.

1 Ответ

2 голосов
/ 23 декабря 2011

Проблема в том, что вы используете один и тот же список results для всех ваших адаптеров. На этот список есть прямые ссылки внутри адаптера, поэтому, когда вы переключаете вкладку, вы обновляете адаптер на всех них (именно поэтому вы получаете исключение IllegalStateException). Вместо того, чтобы повторно использовать переменную результатов, просто создайте новую в вашем методе filldata, нет необходимости (как я вижу из кода выше) использовать ту же самую. Я полагаю, что вы могли бы также использовать CursorAdapters и не беспокоить промежуточный список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...