마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

채팅어플을 만들고 있는데 ListView로 화면을 만들고 있는데 어려운 점이 있습니다.

0 추천
제가 채팅어플에서 대화하는 화면을 ListView로 만들고 있습니다.

   

public class chat3 extends Activity {
 
    String streammsg = "", Client_id, server_ip, server_port ;
    ListView showText;
    EditText editText_massage;
    Button Button_send;
    Handler msghandler;
 
    SocketClient client;
    ReceiveThread receive;
    SendThread send;
    Socket socket;
 
    PipedInputStream sendstream = null;
    PipedOutputStream receivestream = null;
 
    LinkedList<SocketClient> threadList;
    ArrayAdapter<String> adapter;
   
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.chat3);
 
        showText = (ListView) findViewById(R.id.showText_ListView);
        adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1);
        showText.setAdapter(adapter);
       
        editText_massage = (EditText) findViewById(R.id.editText_massage);
        Button_send = (Button) findViewById(R.id.Button_send);
        threadList = new LinkedList<chat3.SocketClient>();

  Intent y;
  y = getIntent();
  server_ip = y.getStringExtra("ip");
  server_port = y.getStringExtra("port");
  Client_id = y.getStringExtra("id");
       
   client = new SocketClient(server_ip,server_port);
         threadList.add(client);
         client.start();
  
  // ReceiveThread를통해서 받은 메세지를 Handler로 MainThread에서 처리(외부Thread에서는 UI변경이불가)
        msghandler = new Handler() {
            @Override
            public void handleMessage(Message hdmsg) {
                if (hdmsg.what == 1111) {
                 adapter.add(hdmsg.obj.toString() + "\n");
                    //showText.add(hdmsg.obj.toString() + "\n");
                }
            }
        };
 
        //전송 버튼 클릭 이벤트
        Button_send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
               
                //SendThread 시작
                if (editText_massage.getText().toString() != null) {
                    send = new SendThread(socket);
                    send.start();
 
                    //시작후 edittext 초기화
                    editText_massage.setText("");
                }
            }
        });
    }
 
    class SocketClient extends Thread {
        boolean threadAlive;
        String ip;
        String port;
        String mac;
 
        //InputStream inputStream = null;
        OutputStream outputStream = null;
        BufferedReader br = null;
 
        private DataOutputStream output = null;
 
        public SocketClient(String ip, String port) {
            threadAlive = true;
            this.ip = ip;
            this.port = port;
        }
 
        @Override
        public void run() {
 
            try {
                // 연결후 바로 ReceiveThread 시작
                socket = new Socket(ip, Integer.parseInt(port));
                //inputStream = socket.getInputStream();
                output = new DataOutputStream(socket.getOutputStream());
                receive = new ReceiveThread(socket);
                receive.start();
               
                //mac주소를 받아오기위해 설정
                WifiManager mng = (WifiManager) getSystemService(WIFI_SERVICE);
                WifiInfo info = mng.getConnectionInfo();
                mac = info.getMacAddress();
               
                //mac 전송
                output.writeUTF(mac);
 
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
 
    class ReceiveThread extends Thread {
        private Socket socket = null;
        DataInputStream input;
 
        public ReceiveThread(Socket socket) {
            this.socket = socket;
            try{
                input = new DataInputStream(socket.getInputStream());           
            }catch(Exception e){           
            }
        }
        // 메세지 수신후 Handler로 전달
        public void run() {
            try {
                while (input != null) {
                   
                    String msg = input.readUTF();
                    if (msg != null) {
                        Log.d(ACTIVITY_SERVICE, "test");
 
                        Message hdmsg = msghandler.obtainMessage();
                        hdmsg.what = 1111;
                        hdmsg.obj = msg;
                        msghandler.sendMessage(hdmsg);
                        Log.d(ACTIVITY_SERVICE,hdmsg.obj.toString());                   
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
 
    class SendThread extends Thread {
        private Socket socket;
        String sendmsg = editText_massage.getText().toString();
        DataOutputStream output;
 
        public SendThread(Socket socket) {
            this.socket = socket;
            try {
                output = new DataOutputStream(socket.getOutputStream());
            } catch (Exception e) {
            }
        }
 
        public void run() {
 
            try {
               
                // 메세지 전송부 (누군지 식별하기위한 방법으로 mac를 사용)
                Log.d(ACTIVITY_SERVICE, "11111");
                String mac = null;
                WifiManager mng = (WifiManager) getSystemService(WIFI_SERVICE);
                WifiInfo info = mng.getConnectionInfo();
                mac = info.getMacAddress();
 
                if (output != null) {
                    if (sendmsg != null) {
                        output.writeUTF(mac + "  :  " +sendmsg);
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            } catch (NullPointerException npe) {
                npe.printStackTrace();
 
            }
        }
    }
}

 

로 진행해 봤는데 화면에 처음 접속되는 안내메시지만 ListView에 출력되고 대화 내용들은 출력되지 않고 있습니다. 혹시 아래에 계속 대화내용을 입력 받아서 화면에 출력하고 싶은데 떻게 구현하면 좋을까요??

 

안드로이드 초보에게 도움즘주세요 ㅜㅜ
앙드리오드 (120 포인트) 님이 2016년 9월 24일 질문

1개의 답변

0 추천
코드는 너무 많아서 분석하기 힘들고
리스트뷰에 아이템을 추가하려면 adapter인스턴스에 아이템을 add 하시고 notifydatasetchanged함수를 호출하셔서 listview에 아이템이 추가되었음을 알려주어야 합니다.
Development Guy (70,570 포인트) 님이 2016년 9월 25일 답변
...