2

Ich habe ein Programm mit füllt einen listview von einem SQLLiteDB. Die Initialload funktioniert, aber wenn ich einen Eintrag bearbeite stürzt das Programm und die simplecursorAdapter = null.Refresh Listview simpleCursorAdapter immer null

Das Fragment:

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); 
} 
} 

Das Stück Code in MainActivity wich es nennt:

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
     if (resultCode == RESULT_OK) 
     { 
      taskListFragment.updateList(); 
     } 
} 

Der Code in der TaskInformation Klasse Hexe läuft, wenn ich aktualisieren klicken

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(); 
} 

Warum ist die simpleCursorAdapter immer NULL wenn ich es aktualisiere? Ich möchte die listview aktualisieren/aktualisieren, wenn ich es aktualisiert habe.

EDIT ------------------------------

Ich versuchte, die prepareCursor wieder, aber es ist immer noch null läuft, Ich kann nicht herausfinden, warum :(

EDIT 2 --------------------------------

ich ein bisschen weiter bin, so scheint es, die context meine adapter brauchte es war verschwunden behoben, indem das Verfahren zu dieser Aktualisierung:.

public void updateList(Context context) 
{ 

    simpleCursorAdapter = new SimpleCursorAdapter (context,R.layout.taskrowlayout,cursor,from,to,0); 
    simpleCursorAdapter.notifyDataSetChanged(); 
    fillList(); 
} 

Nur dieses Mal ist meine cursor leer. Wenn ich versuche, es zu füllen diese mit:

cursor = dbHelper.getTasksForListView(); 

ich diesen Fehler:

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)  

Und hier ist die getTaskForListView Methode:

public Cursor getTasksForListView() 
{ 
    SQLiteDatabase db = this.getWritableDatabase(); 
    Cursor result = db.rawQuery("SELECT * FROM " + TABLE_NAME,null); 
    return result; 
} 

EDIT 3 ------ ----------------

Fehler sind weg, aber immer noch keine Aktualisierung meiner ListView :(Dies ist der Code

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

Mein ListView ist leer in der Update-Methode. Es scheint keinen Weg zu finden, es wiederherzustellen.

ich glaube, das Problem in diesem Stück Code liegt:

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; 
} 

Wie kann ich dieses Stück Code in der Update-Methode erneut ausführen?

Antwort

0

es gefunden, hatte ich mehrere Aktivitäten, die die cursor und list die onActivityResult und dort wieder aufbauen verwendet. fusioniert sie zu einem und es funktioniert: D denke, meine App war verwirrt, wie man damit umgeht.Gefunden, weil der Anforderungscode, wenn er zurückgegeben wurde, eine Nummer war, die ich nie gesetzt habe.

1

Sie müssen keinen neuen Handler erstellen. Sie sollten nur verwenden listView.post(Runnable)

+0

Geändert, thnx für das hinweisend. Leider behebt es das Problem nicht :( – Zeepblok