ListView does not appear in MainActivty of my application (attached image)

After saving a note in an Android app, the note (or ListView) of the / s note does not appear in MainActivity . MainActivity class of my application:

package com.twitter.i_droidi.mynotes; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.ContextMenu; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.Toast; import java.util.List; public class MainActivity extends ActionBarActivity implements AdapterView.OnItemClickListener { ListView lv; NotesDataSource nDS; List<NotesModel> notesList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); nDS = new NotesDataSource(this); lv = (ListView) findViewById(R.id.lv); nDS.open(); notesList = nDS.getAllNotes(); nDS.close(); String[] notes = new String[notesList.size()]; for (int i = 0; i < notesList.size(); i++) { notes[i] = notesList.get(i).getTitle(); } ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, android.R.id.text1, notes); lv.setAdapter(adapter); registerForContextMenu(lv); lv.setOnItemClickListener(this); } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Intent nView = new Intent(this, Second.class); nView.putExtra("id", notesList.get(position).getId()); // Check...!!! startActivity(nView); } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu_delete, menu); super.onCreateContextMenu(menu, v, menuInfo); } @Override public boolean onContextItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.delete: nDS.open(); nDS.deleteNote(lv.getId()); // Check...!!! nDS.close(); Toast nDelete = Toast.makeText(this, "Deleted.", Toast.LENGTH_LONG); nDelete.show(); return true; } return super.onContextItemSelected(item); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.mainMenuNewNote: Intent nNote = new Intent(this, Second.class); startActivity(nNote); return true; case R.id.mainMenuAbout: AlertDialog.Builder aboutDialog = new AlertDialog.Builder(this); aboutDialog.setTitle("About the app"); aboutDialog.setMessage("The Simplest app for notes!\n\n" + "Developed by: Abdulaziz\n" + "Twitter: @i_Droidi\n" + "Telegram: MrGlitch\n\n" + "Special Thanks to who tested the app before upload it on Play Store and to who use it now! :)"); aboutDialog.setIcon(R.mipmap.ic_launcher); aboutDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface aboutDialog, int witch) { // Do Not Do Anything. } }); aboutDialog.show(); return true; case R.id.mainMenuExit: AlertDialog.Builder exDialog = new AlertDialog.Builder(this); exDialog.setTitle("Exit?"); exDialog.setMessage("Are you sure to exit?"); exDialog.setIcon(R.mipmap.ic_launcher); exDialog.setNegativeButton("Yes", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface exDialog, int which) { finish(); } }); exDialog.setPositiveButton("No", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface exDialog, int which) { // Do Not Do Anything. } }); exDialog.show(); return true; } return super.onOptionsItemSelected(item); } } 

activity_main (xml / layout file) of my application:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content"> <ListView android:id="@+id/lv" android:layout_width="fill_parent" android:layout_height="fill_parent"></ListView> </LinearLayout> 

Second class of my application:

 package com.twitter.i_droidi.mynotes; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.widget.EditText; import android.widget.Toast; public class Second extends ActionBarActivity { NotesDataSource nDS; EditText noteTitle; EditText noteBody; int id; DB db; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.second); Intent in = getIntent(); id = in.getIntExtra("id", 0); noteTitle = (EditText) findViewById(R.id.note_title); noteBody = (EditText) findViewById(R.id.note); nDS = new NotesDataSource(this); nDS.open(); NotesModel note = nDS.getNote(id); nDS.close(); noteTitle.setText(note.getTitle()); noteBody.setText(note.getBody()); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu_second, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.secondMenuSave: if (!noteTitle.getText().toString().isEmpty() && !noteBody.getText().toString().isEmpty()) { nDS.open(); nDS.updateNote(id, noteTitle.getText().toString(), noteBody.getText().toString()); nDS.close(); Toast nSave = Toast.makeText(this, "Saved.", Toast.LENGTH_LONG); nSave.show(); finish(); } else { Toast notSave = Toast.makeText(this, "The title and content of the note CANNOT be empty!", Toast.LENGTH_LONG); notSave.show(); } return true; case R.id.secondMenuBack: AlertDialog.Builder baDialog = new AlertDialog.Builder(this); baDialog.setTitle("Back?"); baDialog.setMessage("Do you want to back to the main page before saving the note?"); baDialog.setIcon(R.mipmap.ic_launcher); baDialog.setNegativeButton("Yes", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface baDialog, int which) { finish(); } }); baDialog.setPositiveButton("No", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface baDialog, int which) { // Do Not Do Anything. } }); baDialog.show(); return true; } return super.onOptionsItemSelected(item); } } 

My application's NotesDataSource class:

 package com.twitter.i_droidi.mynotes; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.util.Log; import java.util.ArrayList; import java.util.List; public class NotesDataSource { DB myDB; SQLiteDatabase sql; String[] getAllColumns = new String[]{DB.ID, DB.TITLE, DB.BODY}; public NotesDataSource(Context context) { myDB = new DB(context); } public void open() { try { sql = myDB.getWritableDatabase(); } catch (Exception ex) { Log.d("Error in your database!", ex.getMessage()); } } public void close() { sql.close(); } public void createNote(String title, String body) { ContentValues note = new ContentValues(); note.put(myDB.TITLE, title); note.put(myDB.BODY, body); sql.insert(myDB.TABLE_NAME, null, note); } public NotesModel getNote(int id) { NotesModel note = new NotesModel(); Cursor cursor = sql.rawQuery("SELECT * FROM " + DB.TABLE_NAME + " WHERE " + DB.ID + " = ?", new String[]{id + ""}); if (cursor.getCount() > 0) { cursor.moveToFirst(); note.setId(cursor.getInt(0)); note.setTitle(cursor.getString(1)); note.setBody(cursor.getString(2)); cursor.close(); } return note; } public void updateNote(int id, String title, String body) { ContentValues note = new ContentValues(); note.put(myDB.TITLE, title); note.put(myDB.BODY, body); sql.update(myDB.TABLE_NAME, note, myDB.ID + " = " + id, null); } public void deleteNote(Object id) { sql.delete(myDB.TABLE_NAME, myDB.ID + " = " + id, null); } public List<NotesModel> getAllNotes() { List<NotesModel> notesList = new ArrayList<NotesModel>(); Cursor cursor = sql.query(myDB.TABLE_NAME, getAllColumns, null, null, null, null, null); cursor.moveToFirst(); while (!cursor.isAfterLast()) { NotesModel notes = new NotesModel(); notes.setId(cursor.getInt(0)); notes.setTitle(cursor.getString(1)); notes.setBody(cursor.getString(2)); notesList.add(notes); cursor.moveToNext(); } cursor.close(); return notesList; } } 

DB class of my application:

 package com.twitter.i_droidi.mynotes; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class DB extends SQLiteOpenHelper { private static final String DB_NAME = "MyNotes"; private static final int DB_VERSION = 1; public static final String TABLE_NAME = "MyNotes"; public static final String ID = "id"; public static final String TITLE = "title"; public static final String BODY = "body"; private static final String DB_CREATE = "create table " + TABLE_NAME + " (" + ID + " integer primary key autoincrement, " + TITLE + " text not null, " + BODY + " text not null)"; public DB(Context context) { super(context, DB_NAME, null, DB_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(DB_CREATE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); onCreate(db); } } 

Screenshot of my application (MainActivity) , after saving a note (nothing is displayed!):

How can I solve this problem ?!

Or can anyone write the correct code ?!

Thanks for helping me.

+5
source share
3 answers

I think there are two problems in your code.

1) Replace first

 public List<NotesModel> getAllNotes() { List<NotesModel> notesList = new ArrayList<NotesModel>(); Cursor cursor = sql.query(myDB.TABLE_NAME, getAllColumns, null, null, null, null, null); cursor.moveToFirst(); while (!cursor.isAfterLast()) { NotesModel notes = new NotesModel(); notes.setId(cursor.getInt(0)); notes.setTitle(cursor.getString(1)); notes.setBody(cursor.getString(2)); notesList.add(notes); cursor.moveToNext(); } cursor.close(); return notesList; } 

with these

 public List<NotesModel> getAllNotes() { List<NotesModel> notesList = new ArrayList<NotesModel>(); StringBuffer selectQuery = new StringBuffer(); selectQuery.append("SELECT * FROM "+myDB.TABLE_NAME+""); Cursor cursor = sql.rawQuery(selectQuery.toString(),null); if (cursor != null && cursor.moveToFirst()) { do { NotesModel notes = new NotesModel(); notes.setId(cursor.getInt(0)); notes.setTitle(cursor.getString(1)); notes.setBody(cursor.getString(2)); notesList.add(notes); } while (cursor.moveToNext()); } cursor.close(); return notesList; } 

2) Go to the second class in the list item, click like this:

 Intent nView = new Intent(this, Second.class); nView.putExtra("id", notesList.get(position).getId()); // Check...!!! nView.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(nView); 

and after adding notes back to MainActivity, like this ----

 Intent nView = new Intent(this, MainActivity.class); nView.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(nView); 

dont't use the finish line because it will complete the current task and push the previous screen onto the stack without updating

-1
source

The problem is that onCreate is called only once during the life cycle. When you switch actions, Main just hides and pauses. When you return to this activity, onCreate does not start again.

Override the onStart method and set your list in it. It will be called immediately after onCreate () and when you return to the view. Here is the Android life cycle:

http://developer.android.com/training/basics/activity-lifecycle/starting.html

0
source

This answer assumes that your implementation of Second activity adds a new note to some global model and that the state of this model is reflected in the nDS object that you have > already created in MainActivity (since onCreate() of MainActivity usually not be called, when you finish() Second ).

You should definitely check that the above assumption is correct. If this is not the case, you can use the Singleton form to store data.

To reflect the changes in the ListView , modify / add the following code to MainActivity :

 public class MainActivity extends ActionBarActivity implements AdapterView.OnItemClickListener { ArrayAdapter<String> adapter; NotesDataSource nDS; List < NotesModel > notesList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); nDS = new NotesDataSource(this); ListView lv = (ListView) findViewById(R.id.lv); nDS.open(); notesList = nDS.getAllNotes(); nDS.close(); String[] notes = new String[notesList.size()]; for (int i = 0; i < notesList.size(); i++) { notes[i] = notesList.get(i).getTitle(); } adapter = new ArrayAdapter < String > (MainActivity.this, android.R.layout.simple_list_item_1, android.R.id.text1, notes); lv.setAdapter(adapter); registerForContextMenu(lv); lv.setOnItemClickListener(this); } @Override protected void onResume() { super.onResume(); nDS.open(); notesList = nDS.getAllNotes(); nDS.close(); String[] notes = new String[notesList.size()]; for (int i = 0; i < notesList.size(); i++) { notes[i] = notesList.get(i).getTitle(); } adapter.clear(); adapter.addAll(notes); adapter.notifyDataSetChanged(); } // No changes in other methods ... 

}

Additional note: it is very inefficient and error prone to support ArrayAdapter<String> and List<NotesModel> . This will be better if you implement a custom ListAdapter . You can use something like this:

 class CustomAdapter extends ArrayAdapter<NotesModel> { ... } 

A good tutorial on writing custom adapters can be found here .

0
source

All Articles