2014-03-31 107 views
0

我的程序和列表视图有问题。 我有2项上有一个简单的列表视图ListView儿童问题

李四


大卫琼斯

我想设置的第一个元素,以绿色的背景颜色,但我不断收到当我使用

namesList.getChildAt(0).setBackgroundColor(Color.GREEN); 

一个空指针异常
namesList.getChildCount(); 

总是返回0,即使列表中有2个项目。

我真的不明白为什么这不起作用,是否有一些步骤我错过了。

import android.os.Bundle; 
import android.app.Activity; 
import android.graphics.Color; 
import android.view.Menu; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 

public class LecturerLogsView extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_lecturer_logs_view); 
     ListView namesList = (ListView)findViewById(R.id.namesList); 
     String names[]={"Joe Bloggs", "David Jones"}; 

     ArrayAdapter<String> adapter = new ArrayAdapter<String>(
       this, android.R.layout.simple_list_item_1, 
       names); 
     namesList.setAdapter(adapter); 

     namesList.getChildAt(0).setBackgroundColor(Color.GREEN); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.lecturer_logs_view, menu); 
     return true; 
    } 

} 

xml文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context=".LecturerLogsView" > 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/hello_world" /> 

    <ListView 
     android:id="@+id/namesList" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignLeft="@+id/textView1" 
     android:layout_below="@+id/textView1" > 
    </ListView> 

</RelativeLayout> 
+1

setAdapter是** **异步... getChildCount()等。最终将得到正确的值。改变颜色的地方在适配器本身:) – rupps

+0

@rupps你是这个意思吗? ArrayAdapter 适配器=新ArrayAdapter ( 此,android.R.layout.simple_list_item_1, 名); namesList.getChildAt(0).setBackgroundColor(Color.GREEN); namesList.setAdapter(adapter); ,这仍然不是为我工作不幸 – user2950720

回答

0

setAdapter是一个异步调用。在你调用它之后,它需要一些时间来执行,这就是为什么在分配它之后你得到的值与“无数据”状态一致。

您需要修改适配器getView,这是每次需要视图时由ListView调用的函数。你需要阅读它,这是了解Android小部件的真正功能的关键。

在你的榜样,这将做到这一点:

ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, listItems) { 
     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
       View view=super.getView(position, convertView, parent); // we get the original view 
       if (position==0) view.setBackgroundColor(Color.GREEN); // and change color if position==0 
       return view; 
     } 
}; 

...但我再次建议你仔细阅读这个东西是如何工作的,了解他们对适配器一个很好的教程!

+0

Thankyou我现在明白这一点 – user2950720

0

这是我想尝试:

public class LecturerLogsView extends Activity { 
    ArrayList<String> listItems; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState);    
     listItems = new ArrayList<String>(); 
     listItems.add("Joe Bloggs \n"); 
     listItems.add("David Jones \n"); 
     setContentView(R.layout.activity_lecturer_logs_view); 
     (ListView) getView().findViewById(R.id.namesList) 

     ArrayAdapter<String> adapter = new ArrayAdapter<String>(
       getActivity(), android.R.layout.simple_list_item_1, 
       listItems); 
     namesList.setAdapter(adapter); 

     namesList.getChildAt(0).setBackgroundColor(Color.GREEN); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.lecturer_logs_view, menu); 
     return true; 
    } 

} 

记得要导入的ArrayList。