2015-03-17 3 views
0

Я пытался заполнить ListView из базы данных в фрагменте в Android. К сожалению, при запуске приложения я получаю NullpointerExeption, пока он пытается заполнить &. Создайте мой список. Код, в котором я получаю NullPointerExeptionNullPointerExeption при попытке заполнить список во фрагменте

public class AlarmFrag extends Fragment { 

    List<UserInputAlarmData> UserInputAlarmData = new ArrayList<UserInputAlarmData>(); 
    DatabaseHandler dbHandler; 
    ListView AlarmListView; 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.frag_alarm, container, false); 
     AlarmListView = (ListView)rootView.findViewById(R.id.AlarmListView); 
     return rootView; 

    } 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     dbHandler = new DatabaseHandler(getActivity()); 

     List<UserInputAlarmData> addableAlarmData = dbHandler.getAllAlarmData(); 
     int AlarmDataCount = dbHandler.getAlarmDataCount(); 

     for (int i = 0; i < AlarmDataCount; i++) { 
      UserInputAlarmData.add(addableAlarmData.get(i)); 
     } 

     if (!addableAlarmData.isEmpty()) 
      populateList(); 
    } 

    private void populateList() { 
     ArrayAdapter<UserInputAlarmData> adapter = new AlarmListAdapter(); 
     AlarmListView.setAdapter(adapter); 

    } 

    private void AddAlarm(int id, String name, String phone, String email, String address) { 
     UserInputAlarmData.add(new UserInputAlarmData(id, name, phone, email, address)); 
    } 


    private class AlarmListAdapter extends ArrayAdapter<UserInputAlarmData> { 
     public AlarmListAdapter() { 
      super(getActivity(), R.layout.alarm_view_item, UserInputAlarmData); 

     } 
    } 
} 

ссылочного frag_alarm.xml файл

<?xml version="1.0" encoding="utf-8"?> 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" 
android:background="#363"> 

<TextView android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:gravity="center" 
    android:text="AlarmScreen" 
    android:textSize="20dp" 
    android:layout_centerInParent="true" 
    android:id="@+id/textView" /> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="100px" 
     android:text="Add New Alarm" 
     android:id="@+id/AlarmSetupButton" 
     android:onClick="AlarmSetupButtonClick" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentEnd="true" /> 

    <ListView 
     android:layout_width="0dp" 
     android:layout_height="100dp" 
     android:id="@+id/AlarmListView" 
     android:layout_gravity="center"/> 


</RelativeLayout> 

ссылающегося alarm_view_item.xml файл.

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:weightSum="1"> 

    <TextView 
     android:layout_width="128dp" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:text="Alarm Title:" 
     android:id="@+id/TitleName" 
     android:layout_weight="0.03" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:text="Time:" 
     android:id="@+id/TimeName" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:text="Date:" 
     android:id="@+id/DateName" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:text="Song:" 
     android:id="@+id/SongName" /> 

</LinearLayout> 

Logcat предоставление отчета об аварии.

java.lang.NullPointerException 
      at com.goldin.foodtektrakr.AlarmFrag.populateList(AlarmFrag.java:49) 
      at com.goldin.foodtektrakr.AlarmFrag.onCreate(AlarmFrag.java:44) 
      at android.support.v4.app.Fragment.performCreate(Fragment.java:1763) 
      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:913) 
      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126) 
      at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:739) 
      at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1489) 
      at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:486) 
      at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141) 
      at android.support.v4.view.ViewPager.populate(ViewPager.java:1073) 
      at android.support.v4.view.ViewPager.populate(ViewPager.java:919) 
      at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1441) 
      at android.view.View.measure(View.java:12752) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698) 
      at android.widget.FrameLayout.onMeasure(FrameLayout.java:293) 
      at android.view.View.measure(View.java:12752) 
      at android.widget.LinearLayout.measureVertical(LinearLayout.java:812) 
      at android.widget.LinearLayout.onMeasure(LinearLayout.java:553) 
      at android.view.View.measure(View.java:12752) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698) 
      at android.widget.FrameLayout.onMeasure(FrameLayout.java:293) 
      at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2267) 
      at android.view.View.measure(View.java:12752) 
      at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1074) 
      at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2462) 
      at android.os.Handler.dispatchMessage(Handler.java:99) 
      at android.os.Looper.loop(Looper.java:137) 
      at android.app.ActivityThread.main(ActivityThread.java:4532) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:511) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
      at dalvik.system.NativeStart.main(Native Method) 

Благодарим вас за помощь. Я могу предоставить любые другие файлы классов или xml, необходимые для решения проблемы.

+2

Возможный дубликат [Что такое исключение Null Pointer Exception и как его исправить?] (Http://stackoverflow.com/questions/218384/what-is-a-null-pointer-exception-and-how -do-i-fix-it) – ArchiFloyd

+0

Что такое строка № 49 в AlarmFrag.java? – Lal

+0

Строка 49: AlarmListView.setAdapter (адаптер); – Goldinegg

ответ

2

onCreateView() метод называется после onCreate(). Когда вы вызываете свой метод populateList() с onCreate(), ваш AlarmListView еще не был инициализирован. Итак, просто переместите вызов на метод onCreateView(), чтобы исправить вашу проблему.

Полный Fragment жизненный цикл выглядит следующим образом:

Fragment Lifecycle


теперь я получаю другую ошибку, к сожалению: ArrayAdapter требует идентификатор ресурса, чтобы быть TextView

Instantiate AlarmListAdapter как

private class AlarmListAdapter extends ArrayAdapter<UserInputAlarmData> { 
    public AlarmListAdapter() { 
     super(getActivity(), 
       R.layout.alarm_view_item, 
       R.id.TitleName, // Passing TextView id 
       UserInputAlarmData); 
    } 
} 

Хотя, это избавит вас от ошибки, но это не сделает то, на что вы надеетесь. Я вижу, что у вас есть четыре TextView s в вашем строке позиции строки, но ArrayAdapter может связывать текст только с одним из них. Так как мы прошли R.id.TitleName, то adpater свяжет текст только с первым TextView.

Чтобы разделить ваши adpater запись и отображение данных в нескольких видом, которые делают этот пунктсписок, вам нужно будет расширить ArrayAdapter класс и реализовать getView().Вот одно из многих доступных в Интернете учебников, в которых показано, как его реализовать: ListView with Custom Adpater.

+0

Я, вероятно, делаю это совершенно неправильно, но когда я перемещаю метод onCreateView, я я все еще получаю то же самое сообщение об ошибке. – Goldinegg

+0

Вы можете переместить весь свой код 'onCreate()' в 'onCreateView()', потому что все это относится только к адаптеру. Если это не поможет, обновите сообщение, как выглядит ваш код с помощью stacktracte. –

+0

Большое спасибо. К сожалению, теперь я получаю еще одну ошибку: ArrayAdapter требует, чтобы идентификатор ресурса был TextView – Goldinegg

0

Вы не инициализирован ваш ListView AlarmListView; Так значение по умолчанию любой контрольной переменной является null, поэтому вы получаете Null Pointer Exception

Итак, когда вы называете эту линию

AlarmListView.setAdapter(adapter); 

это на самом деле

null.setAdapter(adapter); 
/\ 
|| 
So Null Pointer Exception 
+0

Он инициализирован ... 'AlarmListView = (ListView) rootView.findViewById (R.id.AlarmListView);' еще раз проверьте код. – Lal

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