2012-08-11 34 views
0

我有一個自定義的ArrayAdapter在adroid聊天應用程序中的listView。我在我的editText組件中輸入一些文本,然後當我按下按鈕時提交文本。使用自定義ArrayAdapter添加一行到列表視圖,而不是更新整個列表

問題是,當我的自定義適配器中的getView方法被調用時,整個列表將刷新,並且列表中的每一行都與提交的最後一個信息相同。

是否有人知道如何在listView中使用自定義ArrayAdapter和其他行來獲取原始文本?

這是我如何調用適配器:

m_discussionThread = new ArrayList<String>(); 
    m_discussionThreadAdapter = new ChatListAdapter(this, m_discussionThread); 
    list.setAdapter(m_discussionThreadAdapter); 

    Button send = (Button) this.findViewById(R.id.send); 
    send.setOnClickListener(new OnClickListener() { 
     public void onClick(View view) { 


      String text = message.getText().toString(); 

      Message msg = new Message(to, Message.Type.chat); 
      msg.setBody(text); 
      m_connection.sendPacket(msg);    
      m_discussionThread.add(text); 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        m_discussionThreadAdapter.notifyDataSetChanged(); 

       } 
      }); 
     } 
    }); 

這是適配器:

public ChatListAdapter(Context context, ArrayList<String> chatValue) { 
    super(context,R.layout.list_row_layout_even, chatValue); 
    this.context = context;  
    this.chatValue = chatValue;  
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater inflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE);   
    View rowView = inflater.inflate(R.layout.list_row_layout_even, parent, false); 
    TextView chatText = (TextView) rowView.findViewById(R.id.chat_message); 
    chatText.setText(chatValue.get(chatValue.size()-1).toString()); 
    return rowView; 
+0

在您的代碼中似乎存在一個錯誤。對於我們來幫助你,我們(至少我)需要你的適配器代碼 – 2012-08-11 13:22:20

+0

謝謝你添加代碼:) – 2012-08-11 13:45:58

+0

感謝您的回答。有用! – AlexGo 2012-08-11 13:56:24

回答

1

接近底部,你得到的數據元素chatValue.size()-1。這意味着每個通過getView()加載的View都將具有最後一個數據元素的屬性。你應該改用position。例如:

private Context mContext; 
private LayoutInflater mInflater = null; 

private ArrayList<String> mChatValue; 

public ChatListAdapter(Context context, ArrayList<String> chatValue) { 
    super(context,R.layout.list_row_layout_even, chatValue); 
    mContext = context;  
    mChatValue = chatValue;  
} 

private LayoutInflater getInflater(){ 
    if(mInflater == null) 
     mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    return mInflater;  
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View rowView; 
    if(convertView == null) // Only inflating if necessary is great for performance 
     rowView = getInflater().inflate(R.layout.list_row_layout_even, parent, false); 
    else 
     rowView = convertView; 

    TextView chatText = (TextView) rowView.findViewById(R.id.chat_message); 
    chatText.setText(mChatValue.get(position)); 

    return rowView; 
} 
相關問題