2015-05-18 92 views
0

所以,我有這ListView,我希望它的每一個items有一個背景(所有這些背景相同)。到目前爲止,我一直在嘗試使用此代碼:爲ListView項目設置背景?

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> 

如果您需要別的東西,請你告訴我會盡力幫助。

+0

NPE發生哪條線? –

+0

@StephenC'listItem.setBackgroundResource(R.drawable.edittext_custom);' –

+0

你是否介意將這些代碼和其他惡意源代碼封裝成一個完整的工作示例? – reporter

回答

2

而不是做這一切你可以創建一個名爲listitem.xml與TextView的一個新的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中設置它就可以完成這項工作。你不需要遍歷列表。

+0

是的,這確實解決了它!從開始開始就一直在尋找類似的東西,但找不到它,我認爲我的增量代碼是一個簡單的解決方案。我猜不會。 –

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); 
} 
+0

'最後整數numVisibleChildren = listView.getChildCount();',這將返回0 –

+0

有多少項列表視圖可見 –

+0

9.反正我寧願用'.getCount()'因爲它將返回列表中的所有項目。 –

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); 
    } 
} 
+0

是的,這是扔我'null' –