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

listview 추가/유지에 대해서..

0 추천
// 버튼에 리스너를 등록한다.
        Button btn = (Button) findViewById(R.id.btn1);
        btn.setOnClickListener(this);
        // ExamData 객체를 관리하는 ArrayList 객체를 생성한다.
        ArrayList<ExamData> data_list = new ArrayList<ExamData>();
        // 사용자 정의 어댑터 객체를 생성한다.
        m_adapter = new ExamAdapter(data_list);
        
        // 리스트를 얻어서 어댑터를 설정한다.
        m_list = (ListView) findViewById(R.id.var_list);
        m_list.setAdapter(m_adapter);
        
        // 한국 기준의 시간으로 날짜의 출력 형태를 정의하여 객체를 생성한다.
        m_date_format = new SimpleDateFormat("yyyy/MM/dd", Locale.KOREA);
        m_time_format = new SimpleDateFormat("HH:mm:ss", Locale.KOREA);
    }
    
    // 버튼이 눌렸을 때 호출되는 이벤트 핸들러
    public void onClick(View view)
    {
        ExamData data = null;
        switch(view.getId()) {
            case R.id.btn1 :
            	user_say="홍길동이 나타났습니다.";
                // 첫번째 버튼이 눌리면 상대방이 이야기하는 듯한 데이터를 구성한다.
                data = new ExamData((byte)0, user_say, m_time_format.format(new Date()));
            	
                break;
        }
        // 어댑터에 데이터를 추가한다.
        m_adapter.add(data);
        // 추가된 영역으로 스크롤을 이동시킨다.
        m_list.smoothScrollToPosition(m_adapter.getCount() - 1);   
    }
    
    // BaseAdapter 를 상속하여 어댑터 클래스를 재정의한다.
    private class ExamAdapter extends BaseAdapter 
    {
        private LayoutInflater m_inflater = null;
        // ExamData 객체를 관리하는 ArrayList
        private ArrayList<ExamData> m_data_list;
        public ExamAdapter(ArrayList<ExamData> items)
        {
            m_data_list = items;    
            // 인플레이터를 얻는다.
            m_inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }
        
        // ArrayList 에 ExamData 객체를 추가하는 메서드
        public void add(ExamData parm_data)
        {
            m_data_list.add(parm_data);
            // 데이터가 변화됨을 알려준다.
            notifyDataSetChanged();
        }

        // 어댑터에서 참조하는 ArrayList 가 가진 데이터의 개수를 반환하는 함수
        @Override
        public int getCount() 
        {
            return m_data_list.size();
        }
        // 인자로 넘어온 값에 해당하는 데이터를 반환하는 함수
        @Override
        public ExamData getItem(int position) 
        {
            return m_data_list.get(position);
        }
        
        // 인자로 넘어온 값에 해당하는 행 ID 를 반환하는 메서드
        @Override
        public long getItemId(int position) 
        {
            return position;
        }
        
        // 인자로 넘어온 값에 해당하는 뷰의 타입을 반환하는 메서드
        @Override
        public int getItemViewType(int position)
        {
            return m_data_list.get(position).type;
        }
        
        // getView 메서드로 생성될 수 있는 뷰의 수를 반환하는 메서드
        @Override
        public int getViewTypeCount()
        {
            return 3;
        }

        // 각 항목에 출력될 뷰를 구성하여 반환하는 메서드
        public View getView(int position, View convertView, ViewGroup parent)
        {
            View view = null;
            // 해당 항목의 뷰 타입을 얻는다.
            int type = getItemViewType(position);
            
            // convertView 뷰는 어댑터가 현재 가지고 있는 해당 항목의 뷰객체이다.
            // null 이 넘어오는 경우에만 새로 생성하고, 그렇지않은 경우에는 그대로 사용한다.
            if(convertView == null) {
                // 타입에 따라 각기 다른 XML 리소스로 뷰를 생성한다.
                switch(type) {
                    case 0 :
                        view = m_inflater.inflate(R.layout.list_item1, null); 
                        break;
                }
            } else {
                view = convertView;
            }
            
            // 요청하는 항목에 해당하는 데이터 객체를 얻는다.
            ExamData data = m_data_list.get(position);
            
            // 데이터가 존재하는 경우
            if(data != null) {
                // 뷰 타입에 따라 값을 설정한다.
                if(type == 0) {
                    TextView user_tv = null, msg_tv = null, date_tv = null;                    
                    user_tv = (TextView) view.findViewById(R.id.user_view1);
                    msg_tv = (TextView) view.findViewById(R.id.message_view1);
                   // date_tv = (TextView) view.findViewById(R.id.date_view1); 
                    
                    // 이름, 메세지, 시간정보를 텍스트뷰에 설정한다.
                    user_tv.setText(user_name);
                    msg_tv.setText(data.data1);
                    //date_tv.setText(data.data2);
                }  
                else if(type == 2) {
                    // 날짜정보를 텍스트뷰에 설정한다.
                    ((TextView)view).setText(data.data1);
                }
            }
            return view;            
        }
    }

 

카카오톡 식의 대화창을 만들기 위해 구글링을 통해 구한 샘플 소스를 수정하고있습니다.

시간도 표시되는 textview와 객체가 있지만 딱히 필요하지 않아서 일단은 빼두었습니다. 

몇몇은 주석처리 해두었습니다.

실행결과는 다음과 같습니다.

 

현재 추가1 버튼만 활성화 한 상태이구요, 추가 1 버튼을 누를 때마다 저렇게 제가 원하는 유저네임 홍길동과

대화내용이 뜹니다.

데이터가 존재하는 경우, 뷰타입..즉 추가1번형식의 대한 텍스트뷰와 이미지뷰가 하나씩 추가가 되는데요.

혹시, 이 대화내용을 앱이 종료되었다가 다시 실행되어도 그대로 저장할 수있는지요..?

기존에 리스트뷰를 저장한 방법은 sql에 간단한 텍스트 정보를 저장 한 후,

가령, 이름이나 전화번호등을 입력하여 추가한 후 앱이 종료되어도 리스트뷰에

텍스트를 출력하는 형식으로만 사용했었습니다.

 

이것 역시 제가 추가1 버튼을 누를 때마다 유저이름/대화내용을 sql로 따로 저장해서

저렇게 출력하는 형식으로 사용해야 할까요?

 

 

anci (19,950 포인트) 님이 2015년 1월 14일 질문

1개의 답변

0 추천
 
채택된 답변
앱이 종료되어도 대화내용을 재구성하려면 sqlite나 서버에 저장해야 가능합니다.

원하시는 요건에 따른 DB 설계 하셔야 되구요.

상기 예제를 보면 기본적으로

테이블 두개 정도 만드셔야 할 것 같네요

채팅 테이블 : 방인덱스 pk, 대화 인덱스, 대화자 아이디 fk, 대화 내용, 대화 시간 정도 저장하시고,

사용자 테이블 :  대화자 아이디, 대화자명, 대화자 저장사진
세기말소년 (3,280 포인트) 님이 2015년 1월 15일 답변
anci님이 2015년 1월 20일 채택됨
...