안녕하십니까. 벌써 저녁이군요.
코드 만지다가, 아무리 봐도 이해가 안 되는 현상이 나와서, 조언을 듣기 위해 질문을 올립니다.
현상을 말씀드리면, 제목대로입니다.
예를 들어 listView에 5개의 데이터를 넣으면, 1~4번째 데이터는 화면에 잘 보이는데, 마지막 5번째의 데이터가 화면에 보이지 않고 대신 1번째의 데이터가 다시 한 번 보입니다.
디버그로 찍어 보면, 데이터 자체는 Adapter 에 1~5 까지 다 들어갔습니다.
코드를 올리면요.
[code]
public class listActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// TODO Auto-generated method stub
setContentView(R.layout.list2 );
...
ArrayList<CSList> dataList = list
MyAdapter adapter = new MyAdapter( this, dataList );
// 리스트 뷰에 어뎁터 연결
ListView listView = ( ListView )findViewById( R.id.listView1 );
listView.setAdapter( adapter );
}
class MyAdapter extends BaseAdapter{
ArrayList<CSList> mList;
int mLength;
listActivity mContext;
LayoutInflater mLayoutInflater;
MyAdapter( Context ctx, ArrayList<CSList> list )
{
this.mContext = ( listActivity )ctx;
this.mList = list;
mLength = list.size();
mLayoutInflater = (LayoutInflater )mContext.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
Log.v( "listActivity", "Adapter:List:size():" + mList.size() );
Log.v( "listActivity", "Adapter:List:first():" + mList.get( 0 ).name );
Log.v( "listActivity", "Adapter:List:last():" + mList.get( mList.size() - 1 ).name );
}
public int getCount() {
//return mList.size();
return mLength;
}
public CSList getItem( int position ) {
return mList.get( position );
}
public long getItemId( int position ) {
return position;
}
public View getView( int position, View convertView, ViewGroup parent ){
if ( convertView == null ) {
Log.v( "SearchLocaltion4", "getView():IN IF:position:" + position );
convertView = mLayoutInflater.inflate(R.layout.listitem, null );
TextView title = (TextView)convertView.findViewById(R.id.txtTitle );
CSList values = mList.get( position );
title.setText( values.name );
TextView addr = (TextView)convertView.findViewById(R.id.txtSearch3ListAddr );
addr.setText( values.address );
convertView.setTag( new Integer(position) );
convertView.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
int pos2 = (Integer)v.getTag( );
Toast.makeText( v.getContext(), "position:pos:" + pos2, 4).show();
Log.v( "listActivity", "getView(). click. position:" + pos2 );
}
});
}
return convertView;
}
}
}
public View getView( int position, View convertView, ViewGroup parent ){
// if ( convertView == null ) { // 매번 새로 써 지도록 if 를 날린다.
Log.v( "SearchLocaltion4", "getView():IN IF:position:" + position );
convertView = mLayoutInflater.inflate(R.layout.listitem, null );
TextView title = (TextView)convertView.findViewById(R.id.txtTitle );
CSList values = mList.get( position );
title.setText( values.name );
TextView addr = (TextView)convertView.findViewById(R.id.txtSearch3ListAddr );
addr.setText( values.address );
convertView.setTag( new Integer(position) );
convertView.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
int pos2 = (Integer)v.getTag( );
Toast.makeText( v.getContext(), "position:pos:" + pos2, 4).show();
Log.v( "listActivity", "getView(). click. position:" + pos2 );
}
});
// }
return convertView;
}
근데...이러려고 ListView 쓰는 거 아니잖아요? OTL
이럴 거면 동적으로 TextView 와 ListView 를 생성해서 inflate 한 다음 주욱 늘어뜨리면 되니까요.
원인이나 올바른(?) 해결책 등, 의견이나 조언 아무거나 좋습니다. 조언 해 주시면 대단히 감사하겠습니다.
그럼, 모두들 좋은 하루 되시기 바랍니다.
참고로, 로그 찍어 보니까 getView 가 0,1,2,3 까지 실행되고 다음 0 이 다시 실행되더군요. listView가 한 화면에 대략 3줄 약간 넘게 화면을 점유하고 있으니까, 그게 연관있지 않을까? 하는 생각이 들긴 합니다만... 정확한건 모르겠습니다. OTL
07-25 10:00:44.071: V/listActivity(1850): getView():START:position:0
07-25 10:00:44.071: V/listActivity(1850): getView():IN IF:position:0
07-25 10:00:44.101: V/listActivity(1850): getView():START:position:1
07-25 10:00:44.111: V/listActivity(1850): getView(): OUT IF: position:1
07-25 10:00:44.122: V/listActivity(1850): getView():START:position:2
07-25 10:00:44.141: V/listActivity(1850): getView(): OUT IF: position:2
07-25 10:00:44.161: V/listActivity(1850): getView():START:position:3
07-25 10:00:44.172: V/listActivity(1850): getView(): OUT IF: position:3
07-25 10:00:44.241: V/listActivity(1850): getView():START:position:0
07-25 10:00:44.241: V/listActivity(1850): getView(): OUT IF: position:0
07-25 10:00:44.271: V/listActivity(1850): getView():START:position:1
07-25 10:00:44.271: V/listActivity(1850): getView(): OUT IF: position:1
07-25 10:00:44.292: V/listActivity(1850): getView():START:position:2
07-25 10:00:44.301: V/listActivity(1850): getView(): OUT IF: position:2
07-25 10:00:44.342: V/listActivity(1850): getView():START:position:3
07-25 10:00:44.342: V/listActivity(1850): getView(): OUT IF: position:3
07-25 10:00:44.501: V/listActivity(1850): getView():START:position:0
07-25 10:00:44.512: V/listActivity(1850): getView():IN IF:position:0
07-25 10:00:44.531: V/listActivity(1850): getView():START:position:1
07-25 10:00:44.541: V/listActivity(1850): getView(): OUT IF: position:1
07-25 10:00:44.581: V/listActivity(1850): getView():START:position:2
07-25 10:00:44.581: V/listActivity(1850): getView(): OUT IF: position:2
07-25 10:00:44.601: V/listActivity(1850): getView():START:position:3
07-25 10:00:44.611: V/listActivity(1850): getView(): OUT IF: position:3
07-25 10:00:45.071: I/ActivityManager(61): Displayed helloworld1.kr.pkg1/.SearchLocale4: +1s141ms
07-25 10:00:45.891: D/dalvikvm(1850): GC_CONCURRENT freed 719K, 51% free 3348K/6727K, external 12036K/13266K, paused 4ms+30ms
07-25 10:00:45.940: D/webviewglue(1850): nativeDestroy view: 0x417f30
07-25 10:00:45.940: D/webviewglue(1850): nativeDestroy view: 0x461370
07-25 10:00:45.961: D/webviewglue(1850): nativeDestroy view: 0x465af8
07-25 10:00:45.981: D/webviewglue(1850): nativeDestroy view: 0x461578
07-25 10:00:47.660: V/listActivity(1850): getView():START:position:4
07-25 10:00:47.660: V/listActivity(1850): getView(): OUT IF: position:4
07-25 10:00:49.340: V/listActivity(1850): getView():START:position:0
07-25 10:00:49.340: V/listActivity(1850): getView(): OUT IF: position:0
07-25 10:00:49.390: V/listActivity(1850): getView():START:position:3
07-25 10:00:49.390: V/listActivity(1850): getView(): OUT IF: position:3
07-25 10:00:50.490: V/listActivity(1850): getView():START:position:4
07-25 10:00:50.490: V/listActivity(1850): getView(): OUT IF: position:4
07-25 10:00:50.600: V/listActivity(1850): getView():START:position:1
07-25 10:00:50.600: V/listActivity(1850): getView(): OUT IF: position:1
여름철 메뚜기가 마냥 부러운 1人




if ( convertView == null ) {
Log.v( "SearchLocaltion4", "getView():IN IF:position:" + position );
convertView = mLayoutInflater.inflate(R.layout.listitem, null );
TextView title = (TextView)convertView.findViewById(R.id.txtTitle );
TextView addr = (TextView)convertView.findViewById(R.id.txtSearch3ListAddr );
}
// -- 이 부분을 빼내세요 --//
CSList values = mList.get( position );
title.setText( values.name );
addr.setText( values.address );convertView.setTag( new Integer(position) );
convertView.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
int pos2 = (Integer)v.getTag( );
Toast.makeText( v.getContext(), "position:pos:" + pos2, 4).show();
Log.v( "listActivity", "getView(). click. position:" + pos2 );
}
});
// -- 이 부분을 빼내세요 --//
return convertView;