'원조안드로이드'님 말대로 row가 null인 경우에 처리를 하려고하면 안됩니다.
그런데 getView에서 row가 null인 경우가 있나요?
Adapter 생성시 넘겨준 resource가 정확하다면,
super.getView()를 호출하실 때 SimpleAdapter의 getView()가 수행을 해서 view를 만들어줄텐데요..
그리고 from과 to의 값이 정확히 의도한 값인지 모르겠군요.
SimpleAdapter보다는 저는 BaseAdapter를 상속받고 구현하기 때문에 정확히는 모릅니다.
하지만 소스코드를 보면 from에는 데이터를 추가하고, to는 뷰 리소스 ID를 추가합니다.
R.id.board_subject가 무슨 view인지는 모르지만 TextView객체같고.. R.id.imageView1은 ImageView같은데...
R.id.imageView1에 데이터가 "img"가 올바른지를 잘 모르겠군요... String.valueOf(R.id.img) 로 해줘야 하지 않을까 합니다.
기본에 대해서 다시 알아보는것이 좋을것같습니다. 인터넷 포스팅만 따라서 개발하지 마시고 책을 사서 보실 것을 권해드립니다.
Adapter 는 성능향상을 위해서 convertView 를 재활용합니다. 일종의 Pool 이라고 보면됩니다.
covertView 가 null 이라는 말은 재활용할 view 가 없어, convertView 를 새로 생성해줘야 한다는 뜻입니다.
if ( convertView == null ) {
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = (View) inflater.inflate(R.layout.list_item, parent, false);
}
ImageView img = (ImageView) convertView.findViewById(R.id.imageView3);
그후에 이미지 할당 코드가 들어가면 될것 같군요.
제 경우 SimpleAdapter보다 BaseAdapter를 사용하는 것이 좀 더 편했습니다.
인터넷에 "Android ListView BaseAdapter" 로 검색하시면 꾀 많은 예제가 있을 것 같네요.
google에서 찾아보면 첫번째에 나오는 링크가 아래에 명시된 주소 입니다.
http://blog.naver.com/PostView.nhn?blogId=truehan207&logNo=120125676286
이 블로그에는 BaseAdapter를 사용하고 ViewHolder를 사용하네요.
ViewHolder는 단순히 View에 대한 포인터를 미리 저장하고 있어서, View를 찾는데 걸리는 시간을 단축하고 사용하는 기법입니다.
한번 보고 따라해보심이 어떨까요?
물론 책도 한번 보면 좋지요~




아답터 클래스의 멤버 변수인 main을 객체 생성하지 마시고
아답터의 생성자에서 받은 MainActivity 객체로 할당해 주셔야죠.
이미 MainActivity는 만들어진 상태에서 아답터 클래스를 생성하는데
거기서다시 new MainActivity()를 하면 아답터의 멤버변수 main과 실제 화면에 출력하고 있는
MainActivity는 서로 다른 객체가 되는 것죠.
그리고 null point exception 은 row가 null인 상태에서
row.findViewById 메소드를 사용하니까 당연히 나죠.
null인 객체에서 메소드를 사용하시면 안되죠.