2014-12-07 67 views
1

我想更新arraylist中的特定項目。更新arraylist中的特定項目

這是Conversation類:

class Conversation 
{ 
    String sender,to,name,bio,picture; 
    Integer id,time,unread; 
    public Conversation() { 

    } 
    public Conversation (int id,String sender,String to,String name,String bio,String picture,int time,int unread) { 
     this.sender=sender; 
     this.to=to; 
     this.id=id; 
     this.name=name; 
     this.bio=bio; 
     this.picture=picture; 
     this.time=time; 
     this.unread=unread; 
    } 

    public void setSender(String sender) { 
     this.sender=sender; 
    } 
    public void setTo(String to) { 
     this.to=to; 
    } 
    public void setId(int id) { 
     this.id=id; 
    } 
    public void setTime(int time) { 
     this.time=time; 
    } 
    public void setUnread(int unread) { 
     this.unread=unread; 
    } 
    public void setName(String name) { 
     this.name=name; 
    } 
    public void setBio(String bio) { 
     this.bio=bio; 
    } 
    public void setPicture(String picture) { 
     this.picture=picture; 
    } 

    public String getSender() { 
     return this.sender; 
    } 
    public String getTo() { 
     return this.to; 
    } 
    public int getId() { 
     return this.id; 
    } 
    public int getTime() { 
     return this.time; 
    } 
    public int getUnread() { 
     return this.unread; 
    } 
    public String getName() { 
     return this.name; 
    } 
    public String getBio() { 
     return this.bio; 
    } 
    public String getPicture() { 
     return this.picture; 
    } 
} 

我加入從數據庫項目到此列表與下面幾行:

public List<Conversation> getAllConversations() { 
    List<Conversation> conversationsList=new ArrayList<Conversation>(); 
    String selectQuery = "SELECT * FROM " + TABLE_CONVERSATIONS+" order by id desc"; 

     SQLiteDatabase db = this.getWritableDatabase(); 
     Cursor cursor = db.rawQuery(selectQuery, null); 
     if (cursor.moveToFirst()) { 
      do { 
       Conversation Conversation = new Conversation(); 
       Conversation.setId(Integer.parseInt(cursor.getString(0))); 
       Conversation.setSender(cursor.getString(1)); 
       Conversation.setTo(cursor.getString(2)); 
       Conversation.setName(cursor.getString(3)); 
       Conversation.setBio(cursor.getString(4)); 
       Conversation.setPicture(cursor.getString(5)); 
       Conversation.setTime(Integer.parseInt(cursor.getString(6))); 
       Conversation.setUnread(Integer.parseInt(cursor.getString(7)));   
       conversationsList.add(Conversation); 
      } while (cursor.moveToNext()); 
     } 
     return conversationsList; 
} 

我要使用特定的項目,但如何setUnread方法?我知道我可以這樣改變:

conversationsList.get(location).setUnread(1); 

但我不知道location.I需要與另一parameter.e.g拿到項目,我可以通過sender值獲得該項目?

我需要的是這樣的:

conversationsList.getByUsername("username").setUnread(1); 

回答

0

ArrayList只能使用一個從零開始的索引來訪問。如果要使用另一個鍵(id或用戶名)訪問元素,則需要使用MapSparseArray(如果使用數字鍵)。

既然你想通過「用戶名」來查找元素,我將使用在下面的示例中的地圖:

public Map<String, Conversation> getAllConversations() { 
    final Map<String, Conversation> conversations = new HashMap<>(); 

    Cursor cursor = ...; 
    while (cursor.moveToNext()) { 
    Conversation conversation = new Conversation(); 
    ... 
    conversations.put(conversation.getSender(), conversation); 
    } 
    cursor.close(); // don't forget to close your cursors! 

    return conversations; 
} 

然後你可以看一下對話是這樣的:

conversations.get("John Doe").setUnread(1); 

注意:您可以使用conversation.setTime(cursor.getInt(6));而不是conversation.setTime(Integer.parseInt(cursor.getString(6)));。 SQLite數據庫並不關心你是存儲一個字符串還是一個整數。

+0

我在適配器中使用此列表。如何繼續使用? – Okan 2014-12-07 21:22:28

+0

@Okan您可以通過Map.values()函數將地圖轉換爲列表 – Dmitry 2014-12-07 21:24:58

+0

我需要一個有序列表hashmap並不保證項目位置。我需要將新項目添加到此hashmap的頂部。如何才能做到這一點? – Okan 2014-12-07 21:54:34