Странная проблема с трансляцией в Android - PullRequest
0 голосов
/ 30 июля 2010

У меня есть только этот фрагмент кода, который довольно прост.У меня есть список, и в методе onCreate я добавил несколько объектов в этот список, чтобы показать их на экране.У меня есть приемник вещания, который должен включать / отключать некоторые элементы списка, когда нет подключения к интернету.

Приемник вещания работает хорошо, если соединение потеряно, когда приложение уже находится на экране этого действия.Проблема в том, что нет соединения до входа в это действие.В этом случае после вызова метода oncreate () в onresume () получатель регистрируется, но когда я вызываю getListView () внутри получателя, у него нет дочернего элемента (хотя я добавил адаптер в метод oncreate иЯ не загружал тогда, используя какой-либо поток вообще).

Может кто-нибудь сказать мне, почему это происходит?

public class MyActivity extends ListActivity {
    private List<MyClass> myObjects;

    private final BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {

            //check if internet connection is available
            boolean networkAvailable = ... ;
            if (!networkAvailable) {
                //No Internet connection: disabled non-cached objects
                List<MyClass> cachedObjects = getCachedObjects();
                for(int i = 0; i<myObjects.size(); i++){
                    MyClass myObject = myObjects.get(i);
                    if (!cachedSurveys.contains(myObject)) {
                        ListView listView = getListView();
                        //The problem is here: listView is empty when there was no connection
                        //before creating the activity so the broadcast receiver was called in a sticky way                     
                        View child = listView.getChildAt(i);
                        child.setEnabled(false);

                    }
                }
            } else {
                // Internet connection: enable all myObjects
                 int size = getListView().getChildCount();
                 for (int i = 0; i < size; i++) {
                    View child = getListView().getChildAt(i);
                    child.setEnabled(true);
                }
            }
        }
     }; 

     @Override
     public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        myObjects = getMyObjects();

        setListAdapter(new ArrayAdapter<MyClass>(this, android.R.layout.simple_list_item_1, myObjects));
        getListView().setTextFilterEnabled(true);   
}

    @Override
    protected void onResume() {
        super.onResume();
        IntentFilter intentFilter = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
        registerReceiver(receiver, intentFilter);
    }

    @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(receiver);
    }
}

Спасибо

1 Ответ

4 голосов
/ 30 июля 2010

Во-первых, я думаю, что мы должны рассмотреть некоторые факты:

  • Действие начнет рисовать свое содержимое после вызова метода onResume (), но не «сразу после»
  • После вызова ListView.setListAdapter (...) ListView сохраняет только объект адаптера, в то время дочернее представление отсутствует.
  • Дочернее представление будет доступно после того, как ListView отобразит этот дочерний элемент на экране (после вызова Adapter.getView ()), и список дочерних представлений будет увеличиваться по одному каждый раз, когда ListView добавляет еще одно дочернее представление, пока ListView не будет их рисовать все на экране.

А для вашего кода причина, по которой вы не можете получить список представлений детей при первом запуске операции, заключается в том, что «ListView ничего не рисовал на экране». Потому что метод onReceive () получателя запускается до отрисовки ListView.

Вы можете проверить это самостоятельно, переопределив адаптер и покажите журнал, чтобы увидеть порядок вызова этих методов. Вот мой результат:

07-30 23:06:03.231: DEBUG/MyActivity(386): onResume 1280505963237   
07-30 23:06:03.281: DEBUG/MyActivity(386): onReceive 1280505963281
07-30 23:06:03.361: DEBUG/MyActivity(386): getView 0 1280505963371
07-30 23:06:03.381: DEBUG/MyActivity(386): getView 1 1280505963386

Надеюсь, мой ответ поможет вам!

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