设置ListView项目的背景



所以,我有这个 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>

如果您需要其他东西,请告诉我,我会尝试提供帮助。

而不是这样做,您可以创建一个名为 listitem.xml的新XML文件,带有TextView,如下

<?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中设置它即可完成工作。您不需要循环浏览列表。

问题是您的此方法。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);
}

假设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);
    }
}

最新更新