2016-04-21 39 views
2

因此,我創建了一個簡單的聯繫人應用程序,並在顯示textview中更新的行時卡住了。我在方法「openUpdateDialog」中發表了一條評論,因爲存在我需要幫助的問題。我希望我的代碼很容易理解,並感謝幫助人員。如何在textview中顯示更新的行?

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

什麼是你準確得到的錯誤....發佈logcat這裏 –

+0

只是添加此adapter.notifyOnDataSetChanged()下面的listview.setAdapter()方法。可能會幫助你。 –

+0

我沒有收到任何錯誤,它只是沒有顯示更新的行。它總是顯示舊的價值。例如:我想添加一個新的聯繫人,我把名稱:「myname」和數字:「1」,然後保存它,然後我點擊列表視圖項來編輯它,因爲我不喜歡名稱爲例,我想將其更改爲:「myname2」,但是當鍵入「myname2」時,將其另存爲「myname」。 – Nenco

回答

1

首先更改列表視圖onItemClick下面

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

       } 
      }); 

然後更改方法openUpdateDialog()作爲下面。

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


      } 
     }); 

它會工作我試過你的代碼。

+0

聯繫人聯繫人=新聯繫人(etNameUpdate.getText()。toString(),etPhoneUpdate.getText()。toString()); handler.updateContact(contact); printDatabase(); – Nenco

+0

這是我第一次嘗試,它沒有工作,也嘗試過你,不工作 – Nenco

0

我想與你的更新方法的問題你已經關閉數據庫操作之前。

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

刪除db.close(),但它仍然讓我舊值 – Nenco

+0

在聯繫contact = new Contact();你值得傳遞的方法 是etNameUpdate.getText()嗎? – Krutik

+0

你們,但我試圖從這兩個領域傳遞文本,它沒有工作。 – Nenco

1

我認爲這個問題是..

singleContact = handler.getContact(id);

它要傳遞到getContact查詢的ID,這不是一個數據庫ID已經在數據庫表中申報。你應該明白這個ID是適配器ID。 對於傳遞數據庫ID,你必須寫一個查詢。首先你得到名稱的數據庫ID。

又通要在聯繫類的構造就像要更新的條目的數據庫ID ..

//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

這是我第一次嘗試,沒有工作 – Nenco

+0

我知道你的意思,但刪除方法是完美的工作。所以這是沒有道理的,這是因爲我通過ID獲取聯繫人的問題,並且我也通過ID刪除了它。所以我的邏輯是,這兩種方法不應該工作,然後 – Nenco