Как использовать .notifyDataSetChanged() для обновления SimpleCursorAdapter в Listfragment?

Я хочу вставить новую строку данных представления в ListView(ListFragment), я уже объявил массив в setAdapter() в методе, но у него есть ошибка с NullPointerException, как мне использовать adapter.notifyDataSetChanged(); в новом методе?

Я попытался снова объявить Cursor в новом методе или объявить SimpleCursorAdapter в классе, но у них есть какая-то ошибка

logCat:

03-21 02:41:30.099: W/dalvikvm(4130): threadid=1: thread exiting with uncaught exception (group=0xa4b60648)
    03-21 02:41:30.103: E/AndroidRuntime(4130): FATAL EXCEPTION: main
    03-21 02:41:30.103: E/AndroidRuntime(4130): java.lang.NullPointerException
    03-21 02:41:30.103: E/AndroidRuntime(4130):     at com.example.mycalc.NoteFragment.updateView(NoteFragment.java:80)
    03-21 02:41:30.103: E/AndroidRuntime(4130):     at com.example.mycalc.MainActivity.updateResult(MainActivity.java:34)
    03-21 02:41:30.103: E/AndroidRuntime(4130):     at com.example.mycalc.CalcFragment$1.onClick(CalcFragment.java:95)
    03-21 02:41:30.103: E/AndroidRuntime(4130):     at android.view.View.performClick(View.java:4240)
    03-21 02:41:30.103: E/AndroidRuntime(4130):     at android.view.View$PerformClick.run(View.java:17721)
    03-21 02:41:30.103: E/AndroidRuntime(4130):     at android.os.Handler.handleCallback(Handler.java:730)
    03-21 02:41:30.103: E/AndroidRuntime(4130):     at android.os.Handler.dispatchMessage(Handler.java:92)
    03-21 02:41:30.103: E/AndroidRuntime(4130):     at android.os.Looper.loop(Looper.java:137)
    03-21 02:41:30.103: E/AndroidRuntime(4130):     at android.app.ActivityThread.main(ActivityThread.java:5103)
    03-21 02:41:30.103: E/AndroidRuntime(4130):     at java.lang.reflect.Method.invokeNative(Native Method)
    03-21 02:41:30.103: E/AndroidRuntime(4130):     at java.lang.reflect.Method.invoke(Method.java:525)
    03-21 02:41:30.103: E/AndroidRuntime(4130):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
    03-21 02:41:30.103: E/AndroidRuntime(4130):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
    03-21 02:41:30.103: E/AndroidRuntime(4130):     at dalvik.system.NativeStart.main(Native Method)

ПримечаниеФрагмент:

package com.example.mycalc;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.ListFragment;
import android.support.v4.widget.SimpleCursorAdapter;
import android.util.Log;
import android.widget.ListView;

public class NoteFragment extends ListFragment {


private DB mDbHelper;
private Cursor mCursor;
private SimpleCursorAdapter adapter;
//String[] from_column = new String[]{DB.KEY_ITEM, DB.KEY_CREATED};
//int[] to_layout = new int[]{android.R.id.text1, android.R.id.text2};

//SimpleCursorAdapter adapter = new SimpleCursorAdapter(getActivity(), android.R.layout.simple_list_item_2,
        //mCursor, from_column, to_layout);

private Cursor newCursor;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //int layout = android.R.layout.simple_list_item_1;

    //ArrayAdapter<String> adapter = new ArrayAdapter(getActivity(), layout, CalcFragment.InputResult);

    //setListAdapter(adapter);

    setAdapter();

    if(Debug.log){ Log.d("NoteFragment", "onCreated");}

}

@Override
public void onStart() {
    super.onStart();
    FragmentManager fm = getFragmentManager();
    if( fm.findFragmentById(R.id.note_fragment)!= null){
        getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
    }
}

public void setAdapter(){

    mDbHelper= new DB(getActivity());
    mDbHelper.open();
    mCursor = mDbHelper.getAll();
    getActivity().startManagingCursor(mCursor);

    String[] from_column = new String[]{DB.KEY_ITEM, DB.KEY_CREATED};
    int[] to_layout = new int[]{android.R.id.text1, android.R.id.text2};

    adapter = new SimpleCursorAdapter(getActivity(), android.R.layout.simple_list_item_2,
            mCursor, from_column, to_layout);

    setListAdapter(adapter);

    if(Debug.log){ Log.d("NoteFragment", "setAdapter");}

}

public void updateView(){

    //mDbHelper= new DB(getActivity());
    //mDbHelper.open();
    //mCursor = mDbHelper.getAll();
    //getActivity().startManagingCursor(mCursor);*/

    //String[] from_column = new String[]{DB.KEY_ITEM, DB.KEY_CREATED};
    //int[] to_layout = new int[]{android.R.id.text1, android.R.id.text2};

    adapter.changeCursor(mCursor);

    adapter.notifyDataSetChanged();

    //if(Debug.log){ Log.d("NoteFragment", "updateView");}
}

}

Основная деятельность:

public class MainActivity extends FragmentActivity implements CalcFragment.OnEqualSelectedListener {
    ...
    @Override
    public void updateResult() {
        NoteFragment fragmentResult = new NoteFragment();
        fragmentResult.updateView();
        if(Debug.log){ Log.d("MainActivity", "updateResult");}
    }

Новое сообщение об ошибке:

03-22 13:49:07.321: W/dalvikvm(1566): threadid=1: thread exiting with uncaught exception (group=0xa4c21648)
03-22 13:49:07.325: E/AndroidRuntime(1566): FATAL EXCEPTION: main
03-22 13:49:07.325: E/AndroidRuntime(1566): java.lang.NullPointerException
03-22 13:49:07.325: E/AndroidRuntime(1566):     at com.example.mycalc.NoteFragment.updateView(NoteFragment.java:80)
03-22 13:49:07.325: E/AndroidRuntime(1566):     at com.example.mycalc.MainActivity.updateResult(MainActivity.java:34)
03-22 13:49:07.325: E/AndroidRuntime(1566):     at com.example.mycalc.CalcFragment$1.onClick(CalcFragment.java:155)
03-22 13:49:07.325: E/AndroidRuntime(1566):     at android.view.View.performClick(View.java:4240)
03-22 13:49:07.325: E/AndroidRuntime(1566):     at android.view.View$PerformClick.run(View.java:17721)
03-22 13:49:07.325: E/AndroidRuntime(1566):     at android.os.Handler.handleCallback(Handler.java:730)
03-22 13:49:07.325: E/AndroidRuntime(1566):     at android.os.Handler.dispatchMessage(Handler.java:92)
03-22 13:49:07.325: E/AndroidRuntime(1566):     at android.os.Looper.loop(Looper.java:137)
03-22 13:49:07.325: E/AndroidRuntime(1566):     at android.app.ActivityThread.main(ActivityThread.java:5103)
03-22 13:49:07.325: E/AndroidRuntime(1566):     at java.lang.reflect.Method.invokeNative(Native Method)
03-22 13:49:07.325: E/AndroidRuntime(1566):     at java.lang.reflect.Method.invoke(Method.java:525)
03-22 13:49:07.325: E/AndroidRuntime(1566):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
03-22 13:49:07.325: E/AndroidRuntime(1566):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
03-22 13:49:07.325: E/AndroidRuntime(1566):     at dalvik.system.NativeStart.main(Native Method)

person Sarah0050    schedule 21.03.2014    source источник
comment
вы можете просто добавить if(adapter!= null) перед использованием адаптера?   -  person Sushil    schedule 21.03.2014
comment
привет Сушил. нет, я не могу, он загрузил данные sqlite при открытии, и когда я снова инициализирую адаптер и курсор для adapter.changeCursor(mCursor);, произошла ошибка с mDbHelper.open(); или mCursor = mDbHelper.getAll();   -  person Sarah0050    schedule 21.03.2014
comment
@ Sarah0050 Вы звоните updateView() до того, как система успеет позвонить onCreate(). Я предлагаю вам прочитать о жизненных циклах Activity и Fragment, чтобы понять, как вызывается onCreate().   -  person Code-Apprentice    schedule 22.03.2014
comment
Я думаю, что onCreate() происходит только при первом запуске приложения, поэтому я устанавливаю адаптер здесь, приложение работает нормально сначала от onCreate() до onResume(), затем, пока я не нажму кнопку из другого фрагмента, чтобы запустить базу данных и список для обновления, это процесс не тот?   -  person Sarah0050    schedule 24.03.2014
comment
Я понимаю, что вы сейчас имеете в виду, там еще одна ошибка не про базы данных, я объявляю новый фрагмент и вызываю метод напрямую, поэтому контекст ни о чем. Я использую Fragment Transaction для замены фрагмента, когда фрагмент создается только что вызванным setAdapter(), и теперь он работает. Спасибо!   -  person Sarah0050    schedule 28.03.2014


Ответы (2)


SimpleCursorAdapter adapter = new SimpleCursorAdapter(getActivity(), android.R.layout.simple_list_item_2,
        mCursor, from_column, to_layout);

Эта строка объявляет переменную local. Вы не инициализируете свою переменную-член с тем же именем. Вы должны изменить его на

adapter = new SimpleCursorAdapter(getActivity(), android.R.layout.simple_list_item_2,
        mCursor, from_column, to_layout);
person Code-Apprentice    schedule 21.03.2014
comment
ой, ты написал первым. ты заслуживаешь +1 - person mcd; 21.03.2014
comment
привет, Code-Guru, mcd. Я сделал это раньше, но была та же ошибка (извините, что массирую перед публикацией), я ее изменю. - person Sarah0050; 21.03.2014
comment
@ Sarah0050 Sarah0050 Пожалуйста, опубликуйте свой обновленный код и новое сообщение об ошибке, чтобы мы могли помочь. - person Code-Apprentice; 21.03.2014
comment
@ Code-Guru Спасибо за помощь. Я только изменил код SimpleCursorAdapter adapterback на adapter, теперь я обновляю новое сообщение об ошибке внизу (та же ошибка) - person Sarah0050; 22.03.2014

на самом деле вы создаете экземпляр адаптера в локальной переменной в методе setAdapter.

так поменяй на

adapter = new SimpleCursorAdapter(getActivity(), android.R.layout.simple_list_item_2,
            mCursor, from_column, to_layout);
person mcd    schedule 21.03.2014