Android ListView儿童问题

Android ListView儿童问题,android,listview,children,Android,Listview,Children,我的程序和列表视图有问题。 我有一个简单的列表视图,上面有两个项目 乔·布洛格斯 大卫·琼斯 我试图将第一个元素的背景色设置为绿色,但是当我使用 namesList.getChildAt(0).setBackgroundColor(Color.GREEN); 也 始终返回0,即使列表中有2项 我真的不明白为什么这不起作用,是不是我错过了一些步骤 import android.os.Bundle; import android.app.Activity; import android.grap

我的程序和列表视图有问题。 我有一个简单的列表视图,上面有两个项目

乔·布洛格斯


大卫·琼斯

我试图将第一个元素的背景色设置为绿色,但是当我使用

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

始终返回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;
    }

}
导入android.os.Bundle;
导入android.app.Activity;
导入android.graphics.Color;
导入android.view.Menu;
导入android.widget.ArrayAdapter;
导入android.widget.ListView;
公共课堂讲师Logsview扩展活动{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u讲师\u日志\u视图);
ListView名称列表=(ListView)findViewById(R.id.namesList);
字符串名[]={“Joe Bloggs”,“David Jones”};
ArrayAdapter适配器=新的ArrayAdapter(
这个,android.R.layout.simple\u list\u item\u 1,
姓名);
namesList.setAdapter(适配器);
namesList.getChildAt(0).setBackgroundColor(Color.GREEN);
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(R.menu.com\u日志\u视图,菜单);
返回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>

这就是我要尝试的:

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;
    }

}
公共课堂讲师LogsView扩展活动{
ArrayList列表项;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
listItems=new ArrayList();
添加(“Joe Bloggs\n”);
listItems.add(“David Jones\n”);
setContentView(R.layout.activity\u讲师\u日志\u视图);
(ListView)getView().findViewById(R.id.namesList)
ArrayAdapter适配器=新的ArrayAdapter(
getActivity(),android.R.layout.simple\u list\u item\u 1,
清单项目);
namesList.setAdapter(适配器);
namesList.getChildAt(0).setBackgroundColor(Color.GREEN);
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(R.menu.com\u日志\u视图,菜单);
返回true;
}
}

请记住导入ArrayList。

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;
       }
 };
ArrayAdapter=new ArrayAdapter(getActivity(),android.R.layout.simple_list_item_1,listItems){
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
View View=super.getView(position,convertView,parent);//我们得到原始视图
if(position==0)view.setBackgroundColor(Color.GREEN);//如果position==0,则更改颜色
返回视图;
}
};

。。。但我再次建议您仔细阅读这些东西是如何工作的,找到一个关于适配器的好教程

setAdapter是异步的。。。getChildCount()等。。最终将得到正确的值。改变颜色的地方在适配器内部:)@rupps你是说这样吗?ArrayAdapter=新的ArrayAdapter(这是android.R.layout.simple\u list\u item\u 1,名称);namesList.getChildAt(0).setBackgroundColor(Color.GREEN);namesList.setAdapter(适配器),不幸的是,这对我仍然不起作用。谢谢你,我现在明白了
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;
       }
 };