2017-08-30 86 views
0

在我的程序中,只要創建ListView並將Simpleadapter設置爲適配器,我嘗試訪問此ListView中的視圖以更改背景這個視圖取決於一個條件。我用ListView.getChildAt(position)方法來做。但是,我得到一個nullPointer異常,我不明白爲什麼。這是我所關心的代碼的一部分。 爲了更好地理解下面的代碼:我實際上在代碼中創建了2個listView,Alarm是我實現的類。我只是通過這個課程獲取一些信息。使用SimpleAdapter訪問listView的視圖

Java代碼:

public class SmartAlarm extends AppCompatActivity { 
    private ListView list_view_alarms; 
    private ListView list_view_activates; 
    private List<HashMap<String, String>> listMapOfEachAlarm; 
    private List<HashMap<String, Integer>> listMapOfActivates; 
    private SimpleAdapter adapter_alarms; 
    private SimpleAdapter adapter_activates; 

    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_smart_alarm); 
     list_view_alarms = (ListView) findViewById(R.id.list_alarm); 
     list_view_activates = (ListView) findViewById(R.id.list_activate); 
     listMapOfEachAlarm = new ArrayList<>(); 
     listMapOfActivates = new ArrayList<>(); 
     adapter_alarms = new SimpleAdapter(this, listMapOfEachAlarm, R.layout.item_alarm, 
new String[]{"alarm", "title"}, new int[]{R.id.time, R.id.title}); 
     adapter_activates = new SimpleAdapter(this, listMapOfActivates, R.layout.item_activate, new String[]{"alarm_drawable"}, new int[]{R.id.activate}); 
     for (Alarm alarm : alarmList) { 
      HashMap<String, String> mapOfTheNewAlarm = new HashMap<>(); 
      mapOfTheNewAlarm.put("alarm", alarm.getTime()); 
      mapOfTheNewAlarm.put("title", alarm.getTitle()); 
      listMapOfEachAlarm.add(mapOfTheNewAlarm); 
      HashMap<String, Integer> mapOfTheAlarmDrawable = new HashMap<>(); 
      if (alarm.getActivated()) { 
       mapOfTheAlarmDrawable.put("alarm_drawable", R.drawable.alarm_on); 
      } else { 
       mapOfTheAlarmDrawable.put("alarm_drawable", R.drawable.alarm_off); 
      } 
      listMapOfActivates.add(mapOfTheAlarmDrawable); 
     } 
     list_view_alarms.setAdapter(adapter_alarms); 
     list_view_activates.setAdapter(adapter_activates); 
     for(int i=0; i<list_view_alarms.getCount();i++) 
     { 
      if(conditionRespected()){ 
       list_view_alarms.getChildAt(i) 
        .setBackgroundColor(getResources().getColor (R.color.dark)); //The compilation error is here because list_view_alarms.getChildAt(i) is null 

      } 
     } 
    } 
} 

activity_smart_alarm.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="@drawable/crazy_alarm" 
android:orientation="vertical" 
android:weightSum="10"> 

<CheckBox 
    android:id="@+id/checkbox" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="left" 
    android:text="Check the box if you want to activate the game" /> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

    <ListView 
     android:id="@+id/list_alarm" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="8" 
     android:choiceMode="singleChoice" 
     android:divider="#FF0000" 
     android:dividerHeight="2dp" /> 

    <ListView 
     android:id="@+id/list_activate" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="2" 
     android:choiceMode="singleChoice" 
     android:divider="#FF0000" 
     android:dividerHeight="2dp" /> 

</LinearLayout> 

</LinearLayout> 

回答

0

對於感興趣的人:要根據特定的條件改變listView中每個視圖的背景,我終於覆蓋了像這樣的方法getView():

public View getView(int position, View convertView, ViewGroup parent) 
    { 
     convertView = super.getView(position, convertView, parent); 
     if(condition){ 
      convertView.setBackgroundColor(getResources().getColor(R.color.dark)); 
     } 
     else 
     { 
      convertView.setBackgroundColor(getResources().getColor(R.color.bright)); 
     } 
     return convertView; 
    } 
0

你沒有設置你的主要觀點。您的列表視圖必須在您的活動實際使用的視圖內部創建。右內你onCreate()添加setContentView(R.layout.activity_main);

您還必須創建一個佈局(在這種情況下activity_main)和你的ListView必須是activity_main佈局

的孩子,這可能是你的activity_main樣子

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/activity_main" 
    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"> 

    //and inside of here would be your listview 
    <android.support.v7.widget.ListViewCompat 
     android:id="@+id/list_alarm" 
     android:layout_width="" 
     android:layout_height=""></android.support.v7.widget.ListViewCompat> 

</RelativeLayout> 
+0

對不起,它已經完成了......我忘了將它複製到我的代碼中......我剛剛完成了它 –

+0

所以你解決了你的問題?還是它還在破? – Rafa

+0

不,我的意思是我忘了將它複製到我放在這裏的代碼,在stackoverflow ...所以我仍然有問題當然:( –