2015-05-13 3 views
3

Я разрабатываю приложение для обмена сообщениями с активностью входящей почты и активностью в разговоре. Для этого я использую базу данных SQL для сохранения всех полученных и отправленных сообщений и добавления их в список просмотра активности входящих сообщений. Я получаю данные из базы данных для добавления. Я не хочу добавлять все сообщения с таким же номером, но с последним, потому что другие сообщения идут в разговор. Помогите мне с этим. Я искал его, но не мог найти его здесь, и еще одна вещь, я просто ученик. Любые входы будут оценены!Избегайте повторения элементов списка для входящих сообщений

Я хочу это

enter image description here

и код Входящих деятельности

public class ReceiveSMSActivity extends Activity { 
DBAdapter myDb; 
private List<Message> MyMessages = new ArrayList<Message>(); 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    openDB(); 

    getResultsAndAppend(); 
    populateListView(); 
} 

private void getResultsAndAppend() { 

    Cursor cursor = myDb.getAllRows(); 
    if (cursor.moveToFirst()) { 
     do { 
      // Process the data: 
      // String name = cursor.getString(DBAdapter.COL_NAME); 
      String number = cursor.getString(DBAdapter.COL_NUMBER); 
      String message = cursor.getString(DBAdapter.COL_MESSAGE); 

      MyMessages.add(new Message(message, number, true)); 

     } while (cursor.moveToNext()); 
    } 

} 

private void populateListView() { 

    ArrayAdapter<Message> adapter = new MyListAdapter(); 
    ListView list = (ListView) findViewById(R.id.listViewInbox); 
    list.setAdapter(adapter); 
} 

private class MyListAdapter extends ArrayAdapter<Message> { 
    public MyListAdapter() { 
     super(ReceiveSMSActivity.this, R.layout.inbox_list_item_layout, 
       MyMessages); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // Make sure we have a view to work with (may have been given null) 
     View itemView = convertView; 
     if (itemView == null) { 
      itemView = getLayoutInflater().inflate(
        R.layout.inbox_list_item_layout, parent, false); 
     } 

     // Find the Message to work with. 
     Message currentMessage = MyMessages.get(position); 

     // Message: 
     TextView message = (TextView) itemView.findViewById(R.id.tvMessage); 
     message.setText(currentMessage.getMessage()); 

     // Number: 
     TextView number = (TextView) itemView.findViewById(R.id.tvNumber); 
     number.setText(currentMessage.getNumber()); 

     return itemView; 
    } 

} 


@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    closeDB(); 
} 

private void openDB() { 
    myDb = new DBAdapter(this); 
    myDb.open(); 

} 

private void closeDB() { 
    myDb.close(); 
} 

}

и DBAdapter() является

public class DBAdapter { 


private static final String TAG = "DBAdapter"; 

// DB Fields 
public static final String KEY_ROWID = "_id"; 
public static final int COL_ROWID = 0; 


public static final String KEY_NAME = "name"; 
public static final String KEY_NUMBER = "number"; 
public static final String KEY_MESSAGE = "message"; 
public static final String KEY_ISSELF= "self"; 


public static final int COL_NAME = 1; 
public static final int COL_NUMBER = 2; 
public static final int COL_MESSAGE = 3; 
public static final int COL_ISSELF = 4; 


public static final String[] ALL_KEYS = new String[] {KEY_ROWID, KEY_NAME, KEY_NUMBER, KEY_MESSAGE, KEY_ISSELF}; 


public static final String DATABASE_NAME = "MyDb"; 
public static final String DATABASE_TABLE = "mainTable"; 

public static final int DATABASE_VERSION = 1; 

private static final String DATABASE_CREATE_SQL = 
     "create table " + DATABASE_TABLE 
     + " (" + KEY_ROWID + " integer primary key autoincrement, " 


     + KEY_NAME + " text not null, " 
     + KEY_NUMBER + " string not null, " 
     + KEY_MESSAGE + " string not null," 
     + KEY_ISSELF + " string not null" 
     + ");"; 


private final Context context; 

private DatabaseHelper myDBHelper; 
private SQLiteDatabase db; 



public DBAdapter(Context ctx) { 
    this.context = ctx; 
    myDBHelper = new DatabaseHelper(context); 
} 

// Open the database connection. 
public DBAdapter open() { 
    db = myDBHelper.getWritableDatabase(); 
    return this; 
} 

// Close the database connection. 
public void close() { 
    myDBHelper.close(); 
} 

// Add a new set of values to the database. 
public long insertRow(String name, String number, String message, String isself) { 

    // Create row's data: 
    ContentValues initialValues = new ContentValues(); 
    initialValues.put(KEY_NAME, name); 
    initialValues.put(KEY_NUMBER, number); 
    initialValues.put(KEY_MESSAGE, message); 
    initialValues.put(KEY_ISSELF, isself); 

    // Insert it into the database. 
    return db.insert(DATABASE_TABLE, null, initialValues); 
} 

// Delete a row from the database, by rowId (primary key) 
public boolean deleteRow(long rowId) { 
    String where = KEY_ROWID + "=" + rowId; 
    return db.delete(DATABASE_TABLE, where, null) != 0; 
} 

public void deleteAll() { 
    Cursor c = getAllRows(); 
    long rowId = c.getColumnIndexOrThrow(KEY_ROWID); 
    if (c.moveToFirst()) { 
     do { 
      deleteRow(c.getLong((int) rowId));    
     } while (c.moveToNext()); 
    } 
    c.close(); 
} 

// Return all data in the database. 
public Cursor getAllRows() { 
    String where = null; 
    Cursor c = db.query(true, DATABASE_TABLE, ALL_KEYS, 
         where, null, null, null, null, null); 
    if (c != null) { 
     c.moveToFirst(); 
    } 
    return c; 
} 

// Get a specific row (by rowId) 
public Cursor getRow(long rowId) { 
    String where = KEY_ROWID + "=" + rowId; 
    Cursor c = db.query(true, DATABASE_TABLE, ALL_KEYS, 
        where, null, null, null, null, null); 
    if (c != null) { 
     c.moveToFirst(); 
    } 
    return c; 
} 

// Change an existing row to be equal to new data. 
public boolean updateRow(long rowId, String name, String number, String message, String isself) { 
    String where = KEY_ROWID + "=" + rowId; 


    // Create row's data: 
    ContentValues newValues = new ContentValues(); 
    newValues.put(KEY_NAME, name); 
    newValues.put(KEY_NUMBER, number); 
    newValues.put(KEY_MESSAGE, message); 
    newValues.put(KEY_ISSELF, isself); 

    // Insert it into the database. 
    return db.update(DATABASE_TABLE, newValues, where, null) != 0; 
} 



///////////////////////////////////////////////////////////////////// 
// Private Helper Classes: 
///////////////////////////////////////////////////////////////////// 

/** 
* Private class which handles database creation and upgrading. 
* Used to handle low-level database access. 
*/ 
private static class DatabaseHelper extends SQLiteOpenHelper 
{ 
    DatabaseHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase _db) { 
     _db.execSQL(DATABASE_CREATE_SQL);   
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion) { 
     Log.w(TAG, "Upgrading application's database from version " + oldVersion 
       + " to " + newVersion + ", which will destroy all old data!"); 

     // Destroy old database: 
     _db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE); 

     // Recreate new database: 
     onCreate(_db); 
    } 
} 

}

ответ

2

Решение может состоять в том, чтобы разобрать все ваше сообщение в hashmap, которое будет иметь номер телефона в качестве ключа и модель «PeopleTexts», эта модель будет иметь список сообщений от тех же людей (число), номер текстов и т. д.

После разбора его вам просто придется перебирать хэш-карту, а не строки db.

Это логика. Теперь некоторые фрагменты кода

public class PeopleTexts { 

    private String phoneNumber; 
    private String name; 
    private ArrayList<Message> peopleTexts; 

    // add setters and getters... 

    public int textCount() { 
     return peopleTexts.size(); 
    } 

    public void addMessage(Message message) { 
     this.peopleTexts.add(message); 
    } 
} 

Теперь вы просто должны делать в своих do...while()

// Мои сообщения теперь Hashmap ...

if (cursor.moveToFirst()) { 
    do { 
     // Process the data: 
     // String name = cursor.getString(DBAdapter.COL_NAME); 
     String number = cursor.getString(DBAdapter.COL_NUMBER); 
     String message = cursor.getString(DBAdapter.COL_MESSAGE); 

     if(MyMessages.containsKey(number)) { 
      MyMessages.put(number, new PeopleTexts(name, number); 
     } 

     MyMessages.get(number).addMessage(new Message(number, message); 

    } while (cursor.moveToNext()); 
} 

Я позволю вам сделать все остальное.

+0

Спасибо, Mathieu за ваш ответ. Я использовал вашу помощь и использовал MyMessages.haskey(), но я получаю сообщение об ошибке «Метод haskey (String) не определен для типа Список « Я не могу использовать этот метод. Посмотрите на это, пожалуйста, –

+0

Извините, это 'containsKey (Object key)' http://docs.oracle.com/javase/6/docs/api/java/util/HashMap.html –

+0

Он просто содержит (boolean), и я тоже пробовал это, но не работал. Показывая все записи. –

Смежные вопросы