Android:ListView.getChildAt()抛出null

时间:2013-12-09 01:08:22

标签: android

有时,当我调用goToLast()时,它会在vista = lista.getChildAt()中抛出一个null异常,它会在列表满了时发生,我不知道为什么我有这个代码:

private void goToLast() {
   lista.post(new Runnable() {
       @Override
       public void run() {

          lista.setSelection(mensajes.getCount() - 1);
          View vista = lista.getChildAt(mensajes.getCount() - 1);
          TextView txtMensaje = (TextView)vista.findViewById(R.id.txtMensajeLista);
          txtMensaje.setBackgroundColor(Color.RED); 
       }
   });
}

2 个答案:

答案 0 :(得分:0)

您应该记录lista.getChildCount(),查看ListView有多少个孩子。 ListView回收视图,这意味着它只能保持限制数量的视图。

因此,如果你想获得最后一个视图,你应该做这样的事情

private void goToLast() {
        lista.post(new Runnable() {
            @Override
            public void run() {

                lista.setSelection(mensajes.getCount() - 1);
                // Figure out the last position of the view on the list.
                int lastViewIndex = lista.getChildCount() - 1;
                View vista = lista.getChildAt(lastViewIndex);
                TextView txtMensaje = (TextView)vista.findViewById(R.id.txtMensajeLista);
                txtMensaje.setBackgroundColor(Color.RED);

            }
        });
}

答案 1 :(得分:0)

ListView.getChildAt()位置与适配器中的位置不同。 ListView会回收其视图,因此如果适配器中有更多项目,而不是适合屏幕,则不会为所有这些项目创建视图,而只会创建可见的视图。如果要更新ListView中的项目,则需要在适配器中更新它并调用notifyDataSetChanged()