2012-08-11 4 views
0

나는 adroid 채팅 응용 프로그램에서 listView에 대한 사용자 정의 ArrayAdapter를 보유하고 있습니다. 내 editText 구성 요소에 일부 텍스트를 입력 한 다음 단추를 누를 때 텍스트를 제출합니다.사용자 정의 ArrayAdapter가있는 listView에 행을 추가하고 전체 목록을 업데이트하지 않습니다.

문제점은 내 사용자 정의 어댑터의 getView 메소드를 호출 할 때 전체 목록이 새로 고쳐지고 목록의 각 행이 마지막으로 제출 된 정보와 동일하게됩니다.

사용자가 ArrayAdapter를 사용하여 listView에 행을 추가하고 다른 행을 원래 텍스트로 추가하는 방법을 아는 사람이 있습니까?

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

코드에 버그가있는 것 같습니다. 우리가 당신을 도울 수 있도록, 우리는 (적어도, 나는) 어댑터 코드를 필요로합니다 –

+0

코드를 추가해 주셔서 감사합니다 :) –

+0

답해 주셔서 감사합니다. 그것은 작동합니다! – AlexGo

답변

1

, 당신이 데이터 요소 chatValue.size()-1을 받고있어

이 내가 어댑터를 호출하는 방법입니다. 즉, getView()를 통해로드 된 모든 뷰에는 마지막 데이터 요소의 속성이 있습니다. 대신 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; 
} 
관련 문제