Используйте Handler.post() для обновления ListView

У меня есть listView, и я использую ArrayAdapter.addAll для загрузки данных. Я хочу использовать ListView.getChild(0) сразу после использования ArrayAdapter.addAll. Но NullPointerException был брошен.

Я пытаюсь добавить ListView.getChild(0) к MessageQueue с помощью Handler.post. Приложение иногда работает, когда я это делаю, но иногда также выбрасывался NullPointerException.

Мой код:

mRightAdapter.addAll(mRightDisplayDatas); 
mHandler.post(new Runnable() {
    @Override public void run() { 
    ((TextView) mLeftListView.getChildAt(0)).setCompoundDrawablesWithIntrinsicBounds(null, null, getResources().getDrawable(R.mipmap.ic_right, mContext.getTheme()), null);
   }
});

бревно:

FATAL EXCEPTION: main
                                                                    Process: com.buledon.volunteerapp, PID: 4787
                                                                    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setCompoundDrawablesWithIntrinsicBounds(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable)' on a null object reference
                                                                        at com.buledon.volunteerapp.widget.CitySelectView$3.run(CitySelectView.java:130)
                                                                        at android.os.Handler.handleCallback(Handler.java:739)
                                                                        at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                        at android.os.Looper.loop(Looper.java:135)
                                                                        at android.app.ActivityThread.main(ActivityThread.java:5669)
                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                        at java.lang.reflect.Method.invoke(Method.java:372)
                                                                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:960)
                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

person Paul Yang    schedule 20.07.2016    source источник
comment
пожалуйста, покажите связанный код вместе с запросом, чтобы лучше понять   -  person Sohail Zahid    schedule 20.07.2016
comment
Пожалуйста, поделитесь своей трассировкой стека, если у вас есть NPE   -  person 0xDEADC0DE    schedule 20.07.2016
comment
Можем ли мы увидеть ваш код макета xml, который вы раздуваете в методе getView() вашего адаптера? Я думаю, вы не должны переводить свое представление в TextView   -  person Hilal    schedule 20.07.2016
comment
Я не использовал getView(), я просто использую оригинальный ArrayAdapter   -  person Paul Yang    schedule 20.07.2016
comment
элемент представляет собой TextView   -  person Paul Yang    schedule 20.07.2016
comment
Проверьте, возвращает ли getChildAt() значение null, прежде чем пытаться манипулировать им.   -  person greenapps    schedule 20.07.2016
comment
У вас есть scrollview, потому что, как я понимаю, getChildAt возвращает ребенка из видимых элементов в списке. Проверьте это , Также это   -  person Hilal    schedule 20.07.2016
comment
Так что, возможно, вы можете попробовать использовать mRightAdapter.getItem(0) вместо mLeftListView.getChildAt(0)   -  person Hilal    schedule 20.07.2016
comment
mRightAdapter.getItem(0) не может вернуть представление, он возвращает объект универсальности   -  person Paul Yang    schedule 20.07.2016
comment
Используйте mLeftListView.post вместо mHandler.post   -  person invisbo    schedule 20.07.2016
comment
Да, вы правы, поэтому кажется, что безопасным способом является реализация метода getView(), как сказал @chejaras.   -  person Hilal    schedule 20.07.2016


Ответы (1)


Также используйте mRightAdapter.notifyDataSetChanged. Также добавленные значения не сразу отражаются в списке. Используйте mHandler.postDelayed и добавьте задержку в несколько миллисекунд. Вы можете проверить, не является ли getChild (0) нулевым значением. Если его значение null снова опубликует обработчик.

Более чистым способом было бы добавить этот код в метод getView() класса Adapter и проверить индекс запрашиваемого представления. Если его 0, выполните свой код. Таким образом, вы будете делать свои вещи в нужном месте и в нужное время.

person chejaras    schedule 20.07.2016