티스토리 뷰
이 자료들은 팁스소프트에서 제공하는 [ 알짜배기 ] 프로그램을 이용하면 더 편리하게 볼수 있습니다.
* 알짜배기 프로그램 받기 - http://www.tipssoft.com/bulletin/tb.php/QnA/8406
* 관리자의 Tipssoft 이야기를 들어보세요 ( 트위터 ID : tipssoft )
* 안드로이드 강좌 목록 - http://www.tipssoft.com/bulletin/tb.php/old_bbs/501
종종 리스트뷰를 사용하다보면 추가된 항목들을 순서대로 정렬해야하는 경우가 있습니다. 이런 경우
직접 항목을 구성할 때 항목들의 문자값들을 비교하면서 정렬되도록 추가할 수도 있지만 리스트뷰의
데이터를 관리하는 ArrayAdapter 객체에 정렬의 기준을 정의한 Comparator 인터페이스 객체를 전달
하여 해당 클래스 객체가 정렬하도록 할 수도 있습니다.
이번 자료에서는 Comparator 인터페이스를 이용하여 정렬을 정하는 방법에 대하여 알아보도록
하겠습니다.
1. Comparator 인터페이스란 ?
Comparator 인터페이스는 두개의 객체를 비교하여 순서를 가릴 때 사용합니다. 비교의 대상이되는
객체가 문자열일 수도 있고, 어떤 클래스의 멤버 변수일 수도 있기 때문에 Comparator 인터페이스는
어떠한 타입이든 사용될 수 있도록 제네릭(Generic) 으로 구성되어 있습니다. 그래서 인터페이스의
추상 메소드를 재정의하거나 인터페이스 객체를 생성할 때에는 자신이 비교할 대상이되는 객체의
타입을 <T> 위치에 반드시 명시해주어야 합니다. 제네릭에 대한 자세한 설명은 아래에 링크된 자료를
참고하시기 바랍니다.
C++ 로 배우는 자바 - 제네릭 : http://www.tipssoft.com/bulletin/tb.php/FAQ/809
Comparator 인터페이스의 멤버 메소드는 compare 와 equals 이며 compare 메소드는 매개 인자로
넘어온 두개의 객체를 대소 비교하는 역할을 하고, equals 메소드는 매개 인자로 넘어온 객체와
자신을 비교하는 역할을 합니다. 두 함수에 대한 자세한 설명은 아래와 같습니다.
1.1 abstract int compare(T lhs, T rhs)
두 객체의 대소 관계를 연산한 후에 결과를 수치값으로 반환합니다. 이 때 넘어오는 객체의 타입은
프로그래머가 어떤 식으로든 대소 관계를 연산할 수 있어야하며 두 값이 동일한 경우에는 0 을
반환하고, lhs 가 rhs 보다 작으면 0 미만의 음수를 반환하고, lhs 가 rhs 보다 크면 0 을 초과하는
양수를 반환해야합니다.
1.2 abstract boolean equals(Object object)
매개 인자로 넘어온 객체와 자신을 비교하여 동일 여부를 판단합니다. 이 메소드는 프로그래머가
굳이 재정의하여 사용할 필요가 없지만 성능을 위해서는 선택적으로 재정의할 수도 있습니다.
2. Comparator 를 사용하는 예
Comparator 인터페이스는 리스트뷰에서 데이터를 사용자가 정한 기준에 의해 정렬하고자할 때
사용할 수 있습니다. 이제부터 리스트뷰의 정렬을 예로들어서 Comparator 인터페이스를 사용하는
방법을 알아보도록 하겠습니다.
먼저 Comparator 인터페이스를 사용하려면 아래의 팩키지를 추가해주어야 합니다.
import java.util.Comparator;
단순하게 하나의 문자열만을 출력하는 리스트뷰의 경우 아래와 같이 간단하게 인터페이스를 정의할
수 있습니다.
// Comparator 인터페이스 객체를 생성한다.
Comparator<String> m_comparator = new Comparator<String>() {
// 문자열을 비교하는 compare 메소드를 재정의한다.
public int compare(String lhs, String rhs)
{
// String 클래스의 compareTo 메소드를 호출하여 문자열의 대소를 가린다.
return lhs.compareTo(rhs);
}
Comparator<String> m_comparator = new Comparator<String>() {
// 문자열을 비교하는 compare 메소드를 재정의한다.
public int compare(String lhs, String rhs)
{
// String 클래스의 compareTo 메소드를 호출하여 문자열의 대소를 가린다.
return lhs.compareTo(rhs);
}
// equals 메소드는 사용하지 않으므로 생략함.
};
};
String 클래스의 compareTo 메소드가 문자열을 비교한 후 반환하는 결과와 Comparator 인터페이스의
compare 메소드에 코드를 구성할 때 반환해야할 결과값이 동일한 규칙을 가지고 있으므로 간단하게
코드를 구성할 수 있었습니다.
아래의 코드는 위의 인터페이스 객체를 이용하여 리스트뷰에 문자열을 추가할 때 정렬하도록 구성한
것입니다.
// 리스트뷰의 데이터를 관리하는 ArrayAdapter 객체
ArrayAdapter<String> m_adapter;
ArrayAdapter<String> m_adapter;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// String 데이터를 저장하는 ArrayList 를 생성한다.
ArrayList<String> list_string = new ArrayList<String>();
// XML 레이아웃과 ArrayList 객체를 관리하는 ArrayAdapter 를 생성한다.
m_adapter = new ArrayAdapter<String>(this, R.layout.listview_item, list_string);
ListView list = (ListView) findViewById(R.id.id_list);
// 리스트뷰에 어댑터를 설정한다.
list.setAdapter(m_adapter);
// 리스트뷰에 리스너를 등록한다.
list.setOnItemClickListener(this);
ArrayList<String> list_string = new ArrayList<String>();
// XML 레이아웃과 ArrayList 객체를 관리하는 ArrayAdapter 를 생성한다.
m_adapter = new ArrayAdapter<String>(this, R.layout.listview_item, list_string);
ListView list = (ListView) findViewById(R.id.id_list);
// 리스트뷰에 어댑터를 설정한다.
list.setAdapter(m_adapter);
// 리스트뷰에 리스너를 등록한다.
list.setOnItemClickListener(this);
Button btn = (Button) findViewById(R.id.id_btn);
// 버튼에 리스너를 등록한다.
btn.setOnClickListener(this);
}
// 버튼에 리스너를 등록한다.
btn.setOnClickListener(this);
}
public void onClick(View view)
{
EditText edit = (EditText) findViewById(R.id.id_edit);
// 에디트텍스트에 입력된 문자열을 얻는다.
String input_str = edit.getText().toString();
// 리스트뷰에 문자열을 추가한다.
m_adapter.add(input_str);
{
EditText edit = (EditText) findViewById(R.id.id_edit);
// 에디트텍스트에 입력된 문자열을 얻는다.
String input_str = edit.getText().toString();
// 리스트뷰에 문자열을 추가한다.
m_adapter.add(input_str);
// 상단에 정의한 Comparater 객체를 이용하여 리스트뷰의 데이터를 정렬한다.
m_adapter.sort(m_comparator);
// 정렬된 문자열의 위치를 인덱스를 얻는다.
int index = m_adapter.getPosition(input_str);
ListView list = (ListView) findViewById(R.id.id_list);
// 리스트뷰에서 문자열이 입력된 위치로 스크롤을 이동한다.
list.smoothScrollToPosition(index);
// 에디트텍스트를 초기화한다.
edit.setText("");
}
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
// 클릭한 리스트뷰의 항목 뷰를 얻어서 TextView 로 캐스팅한다.
TextView select_item = (TextView)view;
EditText edit = (EditText) findViewById(R.id.id_edit);
// 항목 뷰의 문자열을 얻어서 에디트텍스트에 설정한다.
edit.setText(select_item.getText());
}
'프로그램 > 안드로이드 강좌' 카테고리의 다른 글
사진에서 색상정보 추출하기 (0) | 2012.08.15 |
---|---|
간단한 녹음 / 재생 기능 사용하기 (0) | 2012.08.15 |
센서 - 가속도 센서 사용하기 (0) | 2012.08.15 |
나침반 예제 (0) | 2012.08.15 |
센서 - 방향센서 사용하기 (2) | 2012.08.15 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 울산 예쁜 카페
- 울산 맛집
- 안드로이드
- 삼척 추천여행지
- 대구 카페 추천
- 안드로이드 강좌
- 장현동 카페
- 센서
- 파워빌더
- trigger
- 삼척 추천 여행지
- 태그를 입력해 주세요.
- 울산 북구 맛집
- 울산 카페 추천
- PowerBuilder
- 초대장
- 리스트뷰
- 울산 추천 카페
- 티스토리 초대
- 간절곶 맛집
- 트리거
- 티스토리초대장
- MSsql
- 티스토리 초대장
- 울산 중구 카페
- 장현 카페
- 맛집
- 우리동네 카페
- 울산 카페
- 운정신도시
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함