안녕하세요.
listView 와 cursorAdapter를 이용해서 리스트 뷰에 디비 정보를 뿌려주고 있는데요.
로그를 찍으면 정확하게 잘 나오는데, 이상하게 화면에선 리스트 순서가 뒤죽박죽으로 나오네요.
문제점이 뭔지 알려주시면 감사하겠습니다.
ps. 제가 모르고 14를 두번 입력했습니다.
myAdapter = new ChattingListAdapter ( getApplicationContext (), cursor );
chatList.setAdapter ( myAdapter );
chatList.setDivider ( null );
--------------------------------------------------------------------------------------------------
코드 뷰어가 깨져서 일단 이렇게 올려봅니당...
public View newView ( Context context, Cursor cursor, ViewGroup parent ) {
LayoutInflater inflater = LayoutInflater.from ( context );
who = cursor.getString ( cursor.getColumnIndex ( Constants.TABLE_CONVERSATION_FIELD_FROM ) );
if ( who.equals ( "me" ) ) {
view = inflater.inflate ( R.layout.i_talk_layout, parent, false );
textSay = (TextView) view.findViewById ( R.id.i_says );
textDate = (TextView) view.findViewById ( R.id.i_date );
} else {
view = inflater.inflate ( R.layout.friend_talk_layout, parent, false );
textSay = (TextView) view.findViewById ( R.id.friend_says );
textDate = (TextView) view.findViewById ( R.id.friend_date );
}
return view;
}
@ Override
public void bindView ( View view, Context context, Cursor cursor ) {
Date temp = new Date ( cursor.getLong ( cursor.getColumnIndex ( Constants.TABLE_CONVERSATION_FIELD_DATE ) ) );
String date;
date = df.format ( temp.getTime () );
Log.v ( MY_TAG, "textSay :" + cursor.getString ( cursor.getColumnIndex ( Constants.TABLE_CONVERSATION_FIELD_MSG ) ) + ", textDate :" + date);
textSay.setText ( cursor.getString ( cursor.getColumnIndex ( Constants.TABLE_CONVERSATION_FIELD_MSG ) ) );
textDate.setText ( date );
}
public View newView ( Context context, Cursor cursor, ViewGroup parent ) { LayoutInflater inflater = LayoutInflater.from ( context ); who = cursor.getString ( cursor.getColumnIndex ( Constants.TABLE_CONVERSATION_FIELD_FROM ) ); if ( who.equals ( "me" ) ) { view = inflater.inflate ( R.layout.i_talk_layout, parent, false ); textSay = (TextView) view.findViewById ( R.id.i_says ); textDate = (TextView) view.findViewById ( R.id.i_date ); } else { view = inflater.inflate ( R.layout.friend_talk_layout, parent, false ); textSay = (TextView) view.findViewById ( R.id.friend_says ); textDate = (TextView) view.findViewById ( R.id.friend_date ); } return view;} @ Override public void bindView ( View view, Context context, Cursor cursor ) { Date temp = new Date ( cursor.getLong ( cursor.getColumnIndex ( Constants.TABLE_CONVERSATION_FIELD_DATE ) ) ); String date; date = df.format ( temp.getTime () ); Log.v ( MY_TAG, "textSay :" + cursor.getString ( cursor.getColumnIndex ( Constants.TABLE_CONVERSATION_FIELD_MSG ) ) + ", textDate :" + date); textSay.setText ( cursor.getString ( cursor.getColumnIndex ( Constants.TABLE_CONVERSATION_FIELD_MSG ) ) ); textDate.setText ( date );}
애초에 접근 방식이 틀렸습니다.
newView에서는 뷰를 만들었으면 그 뷰는 bindView의 view라는 매개변수로 전달이 됩니다.
그런데 여기서 newView를 거치지 않고 bindView를 올수도 있습니다. view를 재활용하기 때문이죠.
지금 저 로직은 newView를 거치고 바로 bindView로 무조건 온다고 가정하고 짜여져 있습니다.
실제로 그렇게 돌지 않는데 말이죠....
위에분 말씀대로 하셔야 됩니다.
두분 말씀 정말 감사합니다.
public View newView ( Context context, Cursor cursor, ViewGroup parent ) {
LayoutInflater inflater = LayoutInflater.from ( context );
who = cursor.getString ( cursor.getColumnIndex ( Constants.TABLE_CONVERSATION_FIELD_FROM ) );
if ( who.equals ( "me" ) ) {
view = inflater.inflate ( R.layout.i_talk_layout, parent, false );
} else {
view = inflater.inflate ( R.layout.friend_talk_layout, parent, false );
}
return view;
}
---------------------------------------------------------------------------------
public void bindView ( View view, Context context, Cursor cursor ) {
who = cursor.getString ( cursor.getColumnIndex ( Constants.TABLE_CONVERSATION_FIELD_FROM ) );
if ( who.equals ( "me" ) ) {
textSay = (TextView) view.findViewById ( R.id.i_says );
textDate = (TextView) view.findViewById ( R.id.i_date );
} else {
textSay = (TextView) view.findViewById ( R.id.friend_says );
textDate = (TextView) view.findViewById ( R.id.friend_date );
}
// 날짜 처리
Date temp = new Date ( cursor.getLong ( cursor.getColumnIndex ( Constants.TABLE_CONVERSATION_FIELD_DATE ) ) );
String date;
date = df.format ( temp.getTime () );
Log.v ( MY_TAG, "textSay :" + cursor.getString ( cursor.getColumnIndex ( Constants.TABLE_CONVERSATION_FIELD_MSG ) ) + ", textDate :" + date);
textSay.setText ( cursor.getString ( cursor.getColumnIndex ( Constants.TABLE_CONVERSATION_FIELD_MSG ) ) );
textDate.setText ( date );
}
---------------------------------------------
이렇게 처리했더니,, 로그에 6개까지만 출력이 되고, 밑줄 친 라인에서 널포인트 익셉션이 뜹니다.
å
ㅜ ㅜ 요리조리 바꿔봤는데 왜그러는지 알 수가 없어요.
혹시... 짐작가시는 부분이 있으시면 다시 한번 짚어 주시겠어요 ? 감사합니다.
왜 그런진 알았습니다. 다섯번은 제가 쓴 글이 보내지고, 여섯번째 상대방이 보낸 메시지를 받는데...
newVIew에서 또 뷰를 받아오는게 아니니... 찾지 못해서 널포인트가 나는건 알았습니다...
근데 해결 방법을 도저히 찾지 못하겟네용....ㅜ ㅜ 흐긍흐긍
findViewById 계열 애들을... bindView 쪽에서 호출해 쓰세요.. 힌트가 되셨을런지...