设置ListView项目的背景?

时间:2015-05-18 13:50:26

标签: java android listview exception

所以,我有这个ListView,我希望每个items都有一个背景(所有这些都有相同的背景)。到目前为止,我一直在尝试使用此代码:

listView = (ListView) findViewById(R.id.listView);
ArrayAdapter<CharSequence> lv = ArrayAdapter.createFromResource(this,
            R.array.countries_array, android.R.layout.simple_list_item_1);
listView.setAdapter(lv);
for (Integer i = 0; i < listView.getCount(); ++i) {
    View listItem = listView.getChildAt(i);
    listItem.setBackgroundResource(R.drawable.edittext_custom);
}

很简单,我增加i,然后使用它来知道它的位置,它将设置项目背景,并重复直到所有项目具有相同的背景。声音容易。有一个更好的方法吗?如果没有,有人可以帮助弄清楚为什么这个简单的代码不起作用?我很确定我错过了一些基本的东西。

例外:

05-18 15:08:45.659  10157-10157/com.example.fabiocompany.goquiz W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x41917da0)
05-18 15:08:45.679  10157-10157/com.example.fabiocompany.goquiz E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.fabiocompany.goquiz, PID: 10157
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.fabiocompany.goquiz/com.example.fabiocompany.goquiz.TopicosActivity}: java.lang.NullPointerException
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2328)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2386)
            at android.app.ActivityThread.access$900(ActivityThread.java:169)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1277)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5476)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.NullPointerException
            at com.example.fabiocompany.goquiz.TopicosActivity.onCreate(TopicosActivity.java:47)
            at android.app.Activity.performCreate(Activity.java:5451)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2292)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2386)
            at android.app.ActivityThread.access$900(ActivityThread.java:169)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1277)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5476)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
            at dalvik.system.NativeStart.main(Native Method)

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:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:background="@drawable/bggoquiz"
    tools:context="com.example.fabiocompany.goquiz.TopicosActivity"
    android:focusable="true"
    android:focusableInTouchMode="true">

    <ListView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/listView"
        android:layout_below="@+id/searchView"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:layout_marginTop="10dp"
        android:divider="@android:color/transparent"
        android:dividerHeight="20.0sp"
        />

    <SearchView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/searchView"
        android:background="@drawable/edittext_custom"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />

</RelativeLayout>

如果您还需要别的东西,请告诉我,我会尽力帮助。

3 个答案:

答案 0 :(得分:2)

您可以使用textview创建一个名为listitem.xml的新xml文件,而不是完成所有这些操作

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/tv_item"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background = "<give your desired background>"
/>

将ArrayAdapter修改为

ArrayAdapter<String> lv = new ArrayAdapter<String>(this,
            R.layout.listitem, R.id.tv_item, <your array>);

当您对所有项目应用相同的背景时,只需在xml中设置它们即可完成工作。您不需要遍历列表。

答案 1 :(得分:1)

问题在于您使用此方法,listView.getChildAt(i);这仅适用于当前可见的项目 所以这就是你需要使用它们的方式。

final int numVisibleChildren = listView.getChildCount();
final int firstVisiblePosition = listView.getFirstVisiblePosition();
for (int i = firstVisiblePosition; i < firstVisiblePosition + numVisibleChildren; i++) {
     View view = listView.getChildAt(i - firstVisiblePosition);
     listItem.setBackgroundResource(R.drawable.edittext_custom);
}

答案 2 :(得分:1)

假设listView.getChildAt正在返回null,因为相应的位置有一个不可见(或不存在)的对象,那么只需测试null ...

for (Integer i = 0; i < listView.getCount(); ++i) {
    View listItem = listView.getChildAt(i);
    if (listItem != null) {
        listItem.setBackgroundResource(R.drawable.edittext_custom);
    }
}