2016-04-21 9 views
2

Also erstelle ich eine einfache Kontakte-App und bleibe dabei, die aktualisierte Zeile in einer Textansicht anzuzeigen. Ich habe einen Kommentar in der Methode "openUpdateDialog" gemacht, da es das Problem gibt, mit dem ich Hilfe brauche. Ich hoffe, dass mein Code einfach zu verstehen ist und danke für die Hilfe Jungs.Wie wird die aktualisierte Zeile in einer Textansicht angezeigt?

MainActivity.java:

public class MainActivity extends AppCompatActivity { 


DatabaseHandler handler; 
Context context = this; 
ListView listView; 
String textFromEtNameAdd; 
String textFromEtPhoneAdd; 
String textFromListViewName; 
String textFromListViewPhone; 
String textFromListViewID; 
Contact singleContact; 
int idAsIntegerFromListview; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 


    listView = (ListView) findViewById(R.id.listview); 


    if (listView != null) { 

     listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

       TextView tvNameFromListView = (TextView) findViewById(R.id.nameID); 
       TextView tvPhoneFromListView = (TextView) findViewById(R.id.phoneID); 
       TextView tvIDFromListView = (TextView) findViewById(R.id.rowID); 

       textFromListViewName = tvNameFromListView.getText().toString(); 
       textFromListViewPhone = tvPhoneFromListView.getText().toString(); 
       textFromListViewID = tvIDFromListView.getText().toString(); 
       idAsIntegerFromListview = Integer.parseInt(textFromListViewID); 

       singleContact = handler.getContact(id); 


       openUpdateDialog(); 


      } 
     }); 


     listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
      @Override 
      public boolean onItemLongClick(final AdapterView<?> parent, View view, final int position, final long id) { 

       PopupMenu popup = new PopupMenu(context, view); 
       popup.getMenuInflater().inflate(R.menu.menu_delete_popup, popup.getMenu()); 
       popup.show(); 

       popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 
        @Override 
        public boolean onMenuItemClick(MenuItem item) { 

         switch (item.getItemId()) { 

          case R.id.deleteItemID: 


           Contact contact = new Contact(id); 

           handler.deleteContact(contact); 

           printDatabase(); 


           break; 


         } 


         return true; 
        } 
       }); 


       return true; 
      } 
     }); 
    } 


    handler = new DatabaseHandler(this); 
    printDatabase(); 


} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    int id = item.getItemId(); 


    if (id == R.id.action_settings) { 
     return true; 
    } 

    if (id == R.id.addContactID) { 

     openAddDialog(); 


    } 

    return super.onOptionsItemSelected(item); 
} 

public void printDatabase() { 

    Cursor c = handler.getAllContacts(); 


    String[] fromColumns = {handler.KEY_NAME, handler.KEY_ID, handler.KEY_PH_NO}; 
    int[] toViews = {R.id.nameID, R.id.rowID, R.id.phoneID}; 
    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.my_custom_listview, c, fromColumns, toViews, 0); 


    listView.setAdapter(adapter); 


} 


public void openAddDialog() { 

    android.app.AlertDialog.Builder makeDialog = new android.app.AlertDialog.Builder(this); 
    LayoutInflater li = getLayoutInflater(); 
    View viewAdd = li.inflate(R.layout.contacts_add_dialog, null); 
    makeDialog.setView(viewAdd); 


    final EditText etNameAdd = (EditText) viewAdd.findViewById(R.id.etNameID); 
    final EditText etPhoneAdd = (EditText) viewAdd.findViewById(R.id.etPhoneID); 


    makeDialog.setPositiveButton("Save", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 

      textFromEtNameAdd = etNameAdd.getText().toString(); 
      textFromEtPhoneAdd = etPhoneAdd.getText().toString(); 


      Contact contact = new Contact(textFromEtNameAdd, textFromEtPhoneAdd); 

      handler.addContact(contact); 

      printDatabase(); 


     } 
    }); 

    makeDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      dialog.cancel(); 
     } 
    }); 

    android.app.AlertDialog ad = makeDialog.create(); 
    ad.show(); 


} 

public void openUpdateDialog() { 

    android.app.AlertDialog.Builder makeDialog = new android.app.AlertDialog.Builder(this); 
    LayoutInflater li = getLayoutInflater(); 
    View viewUpdate = li.inflate(R.layout.contacts_add_dialog, null); 
    makeDialog.setView(viewUpdate); 


    final EditText etNameUpdate = (EditText) viewUpdate.findViewById(R.id.etNameID); 
    final EditText etPhoneUpdate = (EditText) viewUpdate.findViewById(R.id.etPhoneID); 


    final String singleContactName = singleContact.get_name(); 
    final String singleContactPhone = singleContact.get_phone_number(); 

    etNameUpdate.setText(singleContactName); 
    etPhoneUpdate.setText(singleContactPhone); 


    makeDialog.setPositiveButton("Save", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 


      //name and phone goes in the parenthesis but its storing the old value :/ 
      Contact contact = new Contact(); 

      handler.updateContact(contact); 

      printDatabase(); 


     } 
    }); 

    makeDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      dialog.cancel(); 
     } 
    }); 

    android.app.AlertDialog ad = makeDialog.create(); 
    ad.show(); 


} 


} 

Contact.java:

public class Contact { 


long _id; 
String _name; 
String _phone_number; 

public Contact() { 


} 


public Contact(long _id) { 
    this._id = _id; 
} 

public Contact(String _name, String _phone_number) { 
    this._name = _name; 
    this._phone_number = _phone_number; 
} 

public Contact(long _id, String _name, String _phone_number) { 
    this._id = _id; 
    this._name = _name; 
    this._phone_number = _phone_number; 
} 


public long get_id() { 
    return _id; 
} 

public void set_id(long _id) { 
    this._id = _id; 
} 

public String get_name() { 
    return _name; 
} 

public void set_name(String _name) { 
    this._name = _name; 
} 

public String get_phone_number() { 
    return _phone_number; 
} 

public void set_phone_number(String _phone_number) { 
    this._phone_number = _phone_number; 
} 

@Override 
public String toString() { 
    return _name; 
} 
} 

DatabaseHandler.java:

public class DatabaseHandler extends SQLiteOpenHelper { 


private static final int DATABASE_VERSION = 1; 
private static final String DATABASE_NAME = "contactsManager"; 
private static final String TABLE_CONTACTS = "contacts"; 
public static final String KEY_ID = "_id"; 
public static final String KEY_NAME = "name"; 
public static final String KEY_PH_NO = "phone_number"; 

public DatabaseHandler(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
} 


@Override 
public void onCreate(SQLiteDatabase db) { 
    String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "(" 
      + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT," 
      + KEY_PH_NO + " TEXT" + ")"; 
    db.execSQL(CREATE_CONTACTS_TABLE); 
} 


@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    // Drop older table if existed 
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS); 


    onCreate(db); 
} 


void addContact(Contact contact) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues values = new ContentValues(); 
    values.put(KEY_NAME, contact.get_name()); 
    values.put(KEY_PH_NO, contact.get_phone_number()); 
    db.insert(TABLE_CONTACTS, null, values); 
    db.close(); 
} 

public Contact getContact(long id) { 
    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor cursor = db.query(TABLE_CONTACTS, new String[]{KEY_ID, 
        KEY_NAME, KEY_PH_NO}, KEY_ID + "=?", 
      new String[]{String.valueOf(id)}, null, null, null, null); 
    if (cursor != null) 
     cursor.moveToFirst(); 

    Contact contact = new Contact(Integer.parseInt(cursor.getString(0)), 
      cursor.getString(1), cursor.getString(2)); 

    return contact; 
} 


public Cursor getAllContacts() { 
    List<Contact> contactList = new ArrayList<Contact>(); 
    String selectQuery = "SELECT * FROM " + TABLE_CONTACTS; 
    SQLiteDatabase db = this.getWritableDatabase(); 
    Cursor cursor = db.rawQuery(selectQuery, null); 

    if (cursor.moveToFirst()) { 
     do { 
      Contact contact = new Contact(); 
      contact.set_id(Integer.parseInt(cursor.getString(0))); 
      contact.set_name(cursor.getString(1)); 
      contact.set_phone_number(cursor.getString(2)); 

      contactList.add(contact); 
     } while (cursor.moveToNext()); 
    } 


    return cursor; 
} 


public int updateContact(Contact contact) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues values = new ContentValues(); 
    values.put(KEY_NAME, contact.get_name()); 
    values.put(KEY_PH_NO, contact.get_phone_number()); 


    return db.update(TABLE_CONTACTS, values, KEY_ID + " = ?", 
      new String[]{String.valueOf(contact.get_id())}); 
} 


public void deleteContact(Contact contact) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    db.delete(TABLE_CONTACTS, KEY_ID + " = ?", 
      new String[]{String.valueOf(contact.get_id())}); 
    db.close(); 
} 


} 
+0

Was ist der Fehler, bekommen Sie genau ... post logcat hier –

+0

fügen Sie einfach diese adapter.notifyOnDataSetChanged() unter listview.setAdapter() -Methode. Möge das dir helfen. –

+0

Ich bekomme keine Fehler, es zeigt nur nicht die aktualisierte Zeile. es zeigt immer den alten Wert an. Beispiel: Ich möchte einen neuen Kontakt hinzufügen und den Namen "myname" eingeben und für die Nummer: "1", dann speichert es und dann klicke ich auf den Listeneintrag, um ihn zu bearbeiten, weil mir der Name nicht gefällt und ich will ändere es in: "myname2", aber wenn ich "myname2" eintippe, wird es als "myname" gespeichert. – Nenco

Antwort

1

erste Änderung Listenansicht onItemClick mit unter

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

        if(parent.getItemAtPosition(position) instanceof Cursor){ 
         Log.e(TAG, "onItemClick: Cursor Object"); 
         Cursor c = (Cursor) parent.getItemAtPosition(position); 
         if(c != null){ 
          String idd = c.getString(c.getColumnIndex(handler.KEY_ID)); 
          Log.e(TAG, "onItemClick: idd " +idd); 
          idAsIntegerFromListview = Integer.parseInt(idd); 
         } 
        } 

        singleContact = handler.getContact(idAsIntegerFromListview); 
        openUpdateDialog(); 

       } 
      }); 

Dann wechseln in Methode openUpdateDialog() als unten.

makeDialog.setPositiveButton("Save", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 


       //name and phone goes in the parenthesis but its storing the old value :/ 
       Contact contact = new Contact(); 
       contact.set_id(idAsIntegerFromListview); 
       contact.set_name(etNameUpdate.getText().toString()); 
       contact.set_phone_number(etPhoneUpdate.getText().toString()); 
       handler.updateContact(contact); 

       printDatabase(); 


      } 
     }); 

Es wird funktionieren Ich habe versucht, Ihren Code.

+0

Kontakt contact = neuer Kontakt (etNameUpdate.getText(). ToString(), etPhoneUpdate.getText(). ToString()); handler.updateKontakt (Kontakt); printDatabase(); – Nenco

+0

das war mein erster Versuch und es hat nicht funktioniert, versuchte auch, funktioniert nicht – Nenco

0

Ich denke Problem mit Ihrem Update-Methode Sie db vor geschlossen Betrieb .

public int updateContact(Contact contact) { 
     SQLiteDatabase db = this.getWritableDatabase(); 
     ContentValues values = new ContentValues(); 
     values.put(KEY_NAME, contact.get_name()); 
     values.put(KEY_PH_NO, contact.get_phone_number()); 


     int noOfUpdatedRow=db.update(TABLE_CONTACTS, values, KEY_ID + " = ?", 
       new String[]{String.valueOf(contact.get_id())}); 
     db.close(); 
     return noOfUpdatedRow; 
    } 
+0

entfernt db.close(), aber es erhält immer noch den alten Wert – Nenco

+0

in Kontakt contact = new Contact(); Methode welcher Wert übergeben Sie ist es EtNameUpdate.getText()? – Krutik

+0

ye, aber ich habe versucht, Texte aus diesen 2 Feldern und es hat nicht funktioniert. – Nenco

1

Ich denke, das Problem ist ..

singleContact = handler.getContact(id);

Die ID, die Sie getContact Abfrage vorbei ist dies nicht eine Datenbank-ID, die in der Datenbanktabelle deklariert haben. Sie sollten verstehen, dass diese ID die Adapter-ID ist. Für die Übergabe der Datenbank-ID müssen Sie eine Abfrage schreiben. Zuerst erhalten Sie die Datenbank-ID mit Namen.

Und passiert Datenbank ID, in dem Eintrag, den Sie in Kontakt Klassenkonstruktors aktualisieren mögen wie ..

//name and phone goes in the parenthesis but its storing the old value :/ 
     Contact contact = new Contact(etNameUpdate.getText().toString(), etPhoneUpdate .getText().toString(), id); 

     handler.updateContact(contact); 
+0

das war mein erster Versuch, hat nicht funktioniert – Nenco

+0

Ich weiß, was Sie meinen, aber löschen Methode funktioniert perfekt. Es macht also keinen Sinn, dass dies das Problem ist, weil ich den Kontakt per ID erhalte und ich ihn auch nach ID lösche. Meine Logik ist also, dass beide Methoden nicht funktionieren sollten. – Nenco

Verwandte Themen