티스토리 뷰

학교/졸업작품

ListView 및 Gallery의 사용

사탕맛커피 2011. 8. 22. 20:40

프로그램 특성상 ListView의 사용이 많아서 여기에 정리한다. 

ListView를 사용하기 위해서는 다음의 재료가 필요하다.

내용이 들어있는 Item의 Array, ListView 객체, 이 둘을 연결해 줄 Adapter, item의 내용이 들어갈 item layout(xml파일)

Item은 리스트의 각 줄마다 들어갈 내용으로, 이 Item을 모아놓은 Array가 필요하다.Array는 배열일 수도 있고, List, ArrayList일 수도 있다.(만드는 사람 마음) 
내용의 추가삭제가 용의하게 ArrayList를 이용하는 것이 편하다.

Adapter는 ArrayAdapter<Item>을 extend해서 만든다. 생성자 및 몇 가지 메소드를 override하면 되는데 getCount(), getItem(), getView()정도 면 된다. 여기서 중요한 건 getView인데, 여기서 각 row의 내용을 생성하게 된다.

ListView객체는 생성한 후 setAdapter메소드로 adapter를 연결하면 된다.

getView 메소드를 살펴보면

1 @Override 2 public View getView(int position, View convertView, ViewGroup parent) { 3 View v = convertView; 4 if (v == null){ 5 v = mInflater.inflate(R.layout.item_layout, null); 6 } 7 8 Item item = Item.get(position); 9 if (item != null){ 10 ... item_layout의 내용을 생성... 11 } 12 return v; 13 }

convertView값이 null이면 LayoutInflater를 사용해서 item의 내용이 들어갈 layout을 inflate하고, 내용이 있으면 예전에 getView()메소드로 생성했던 view이므로 재사용한다. 
ArrayList에서 position에 해당되는 행을 찾아서 그 내용을 item_layout에 지정한다.ArrayList는 미리 생성자에서 지정해둔다. 
마지막으로 작업한 view를 return한다.

Gallery의 경우도 비슷하다. 다만 Item이 ImageView로 정해져 있고, Adapter는 BaseAdapter를 extends해서 만든다.

1 public View getView(final int position, View convertView, ViewGroup parent) { 2 ImageView iv = new ImageView(mContext); 3 iv.setImageBitmap(bitmap); 4 iv.setScaleType(ImageView.ScaleType.CENTER_INSIDE); 5 iv.setLayoutParams(new Gallery.LayoutParams(width, height)); 6 return iv; 7 }

Gallery는 ImageView를 생성해서 적절하게 처리하면 된다.

ListView나 Gallery의 adapter내용을 변경하려면 해당 뷰의 adapter를 getAdapter()메소드로 받아서 처리 한 후 다시 setAdatper()메소드로 지정해 준다.

1 Adapter adapter = listview.getAdapter(); 2 ... 3 listview.setAdatper(adapter);

Intent로 다른 Activity를 호출할 때 extra data를 넣어서 호출하는 경우가 있다. 예를 들어 B, C 액티비티가 A액티비티를 각각 호출할 때, B는 extra data를 넣어서 호출한다고 하면, A에서는 어떤 액티비티가 호출했는지 구분하기 위해 extra data를 분석할 것이다.

그런데, 만일 B –> A –> C –> A순으로 호출되는 경우를 생각해보면, A에서 B가 호출했다는 것을 알 수 있지만, 이후 A->C->A순으로 호출되면 엉뚱하게도 C에서 호출한 것이 아니라 B에서 호출한 것으로 나온다.

이것은 B에서 A에 전달한 extra data가 이후 호출과정에서도 계속 남아 있기 때문에 A에서 분석할 때 착각하는 것이다. 
해결책은 호출한 액티비티를 구분할 용으로 사용한 데이터는 사용 후 바로 삭제하면 된다.

 

SQLite를 사용할 때에 query(), rawQuery(), execSQL()메소드가 있는데, 
반드시 SELECT문을 사용할 때는 query, rawQuery 메소드를 
그 외에 INSERT, DELETE, UPDATE등을 사용할 때는 execSQL 메소드를 사용한다.

비슷하다고 거꾸로 하면 결과가 제대로 나오지 않는다.

execSQL메소드는 리턴 값이 없기 때문에 쿼리용으로 쓸 수 없고, query, rawQuery는 쿼리용도로만 쓴다.

그리고 반드시 SQL문의 끝에 ;(세미콜론)이 붙어 있는지 확인한다. 잘 만들어 놓고 세미콜론 하나 때문에 안 돌아가는 경우가 꽤 있었다.

사용한 Cursor와 db객체는 사용이 끝나면 반드시 닫는다. 오류가 발생하지는 않지만 logcat에 오류메시지가 올라온다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함