У меня есть программа с заполнением listview
от SQLLiteDB
. Начальная загрузка работает, но когда я редактирую запись, программа вылетает и simplecursorAdapter = null
.Обновить Listview simpleCursorAdapter всегда null
Обломок:
public class TaskListFragment extends ListFragment
{
DBHelper dbHelper;
SimpleCursorAdapter simpleCursorAdapter;
Cursor cursor;
ListView listView;
static final int UPDATE_TASK = 1;
String[] from = {dbHelper.COL_2,dbHelper.COL_3};
int[] to = new int[]{R.id.taskName , R.id.taskDescription};
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View rootView = inflater.inflate(R.layout.tasklistlayout, container, false);
listView = (ListView)rootView.findViewById(android.R.id.list);
setRetainInstance(true);
return rootView;
}
@Override
public void onActivityCreated(Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
dbHelper = new DBHelper(getActivity());
prepareCursor();
}
public void prepareCursor()
{
new Handler().post(new Runnable()
{
@Override
public void run()
{
cursor = dbHelper.getTasksForListView();
simpleCursorAdapter = new SimpleCursorAdapter (getActivity(),R.layout.taskrowlayout,cursor,from,to,0);
fillList();
}
});
}
public void updateList()
{
simpleCursorAdapter.notifyDataSetChanged();
fillList();
}
public void fillList()
{
setListAdapter(simpleCursorAdapter);
}
@Override
public void onListItemClick(ListView l, View v, int position, long id)
{
Intent intent = new Intent(getActivity().getApplicationContext(), TaskInformation.class);
intent.putExtra("taskId", cursor.getInt(0));
intent.putExtra("taskName", cursor.getString(1));
intent.putExtra("taskDescription", cursor.getString(2));
intent.putExtra("taskStartDate", cursor.getString(3));
intent.putExtra("taskEndDate", cursor.getString(4));
startActivityForResult(intent, UPDATE_TASK);
}
}
Кусок кода в MainActivity Wich называет его:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
if (resultCode == RESULT_OK)
{
taskListFragment.updateList();
}
}
код в классе TaskInformation ведьмой работает, когда я нажимаю обновить
public void updateTask(View view)
{
task = new ArrayList<>();
task.add(0,String.valueOf(currentTaskId));
task.add(1,String.valueOf(taskName.getText()));
task.add(2,String.valueOf(taskDescription.getText()));
task.add(3,String.valueOf(startDate.getText()));
task.add(4,String.valueOf(endDate.getText()));
dbHelper.updateTask(task);
setResult(RESULT_OK, intent);
finish();
}
Почему simpleCursorAdapter
всегда NULL
, когда я его обновляю? Я хочу обновить/перезагрузить listview
, когда я его обновил.
EDIT ------------------------------
Я попробовал еще раз, но его по-прежнему нулевой запуск prepareCursor, Я не могу понять, почему :(
EDIT 2 --------------------------------
Я немного дальше, кажется, context
мой adapter
нужен ушел Fixed его обновления метод следующим образом:.
public void updateList(Context context)
{
simpleCursorAdapter = new SimpleCursorAdapter (context,R.layout.taskrowlayout,cursor,from,to,0);
simpleCursorAdapter.notifyDataSetChanged();
fillList();
}
Только на этот раз мой cursor
пуст. При попытке пополнить его с помощью этого:
cursor = dbHelper.getTasksForListView();
Я получаю эту ошибку:
05-18 07:30:59.478 7323-7323/com.owlfinity.zeepblok.taskjournal E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.owlfinity.zeepblok.taskjournal, PID: 7323
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=65537, result=-1, data=Intent { cmp=com.owlfinity.zeepblok.taskjournal/.TaskInformation (has extras) }} to activity {com.owlfinity.zeepblok.taskjournal/com.owlfinity.zeepblok.taskjournal.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.Cursor com.owlfinity.zeepblok.taskjournal.DBHelper.getTasksForListView()' on a null object reference
at android.app.ActivityThread.deliverResults(ActivityThread.java:3699)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742)
at android.app.ActivityThread.-wrap16(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.Cursor com.owlfinity.zeepblok.taskjournal.DBHelper.getTasksForListView()' on a null object reference
at com.owlfinity.zeepblok.taskjournal.TaskListFragment.updateList(TaskListFragment.java:61)
at com.owlfinity.zeepblok.taskjournal.MainActivity.onActivityResult(MainActivity.java:37)
at android.app.Activity.dispatchActivityResult(Activity.java:6428)
at android.app.ActivityThread.deliverResults(ActivityThread.java:3695)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742)
at android.app.ActivityThread.-wrap16(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
А вот метод getTaskForListView:
public Cursor getTasksForListView()
{
SQLiteDatabase db = this.getWritableDatabase();
Cursor result = db.rawQuery("SELECT * FROM " + TABLE_NAME,null);
return result;
}
EDIT 3 ------ ----------------
Ошибки пропали, но не обновлены ListView
:(это код
public void updateList(Context context)
{
dbHelper = new DBHelper(context);
cursor = dbHelper.getTasksForListView();
simpleCursorAdapter = new SimpleCursorAdapter (context,R.layout.taskrowlayout,cursor,from,to,0);
fillList();
}
public void fillList()
{
dbHelper = new DBHelper(getActivity());
setListAdapter(simpleCursorAdapter);
}
---- EDIT 4
Мой ListView
пуст в методе обновления. Кажется, не может найти способ воссоздать его.
Я думаю, что проблема лежит в этой части кода:
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View rootView = inflater.inflate(R.layout.tasklistlayout, container, false);
listView = (ListView)rootView.findViewById(android.R.id.list);
setRetainInstance(false);
return rootView;
}
Как я могу повторно запустить этот кусок кода в методе обновления?
Изменено, thnx для указания этого. к сожалению, это не устраняет проблему :( – Zeepblok