2015-05-18 6 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

Вместо того чтобы делать все это вы могли бы создать новый файл XML с именем listitem.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, выполните работу. Вам не нужно перебирать список.

+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

'final Integer 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» –

Смежные вопросы