[android] ListView 사용하기 (Custom Adapter 사용)
저번 프로그램을 개발하면서.. ListView를 써볼일이 있었는데..
나중에 참고하려고 정리해둔다는걸.. 미루다..
지금다시 정리하려고 하니, 기억이 잘 안난다는.. ㅠ.ㅠ
그래도 일단 몇줄 적어놓는다.
일단 완성화면
일단.. ListActivity 를 상속받아도 되고.. 아니면 그냥 Activity를 상속받아도 된다.
ListActivity를 상속받으면, activity안에 listview가 하나 있다고 가정하고서.. 몇가지를 좀 편리하게 이용할수 있게 해주는데..
나는 그냥 Activity를 상속받아 했다.
layout xml에.. listview를 하나 놓고, (@+id/lvFclList), listview에 뿌려줄 layout도 하나(facility_list_item.xml) 만들어놓는다.(TextView2개 포함:@+id/tvItemFname, @+id/tvItemFAddr)
출력해줄 Activity에서..
==============
public class FacilityListActivity extends Activity {
..
private ListView lvFclList;
private FclListAdapter fclLstAdpt; // 나중에 선언해줄것임.
..
public void onCreate(…) {
..
lvFclList = (ListView)findViewById(R.id.lvFclList);
lvFclList.setEmptyView((TextView)findViewById(R.id.list_empty));
lvFclList.setOnItemClickListener(fclListOnItemClickLsnr);
..
btnSearch = (Button)findViewById(R.id.btnSearch); // 검색버튼
btnSearch.setOnClickListener(actvtOnClickLsnr); // 검색실행을 위한 리스너
..
}
// custom view 이용한 adapter 만들기 (정리해서 필요한것만 쓰려고 했는데.. 귀찮아서.. 소스 붙여넣기.. 크크..)
protected class FclListAdapter extends ArrayAdapter<FacilityTo> {
private Context context;
private List<FacilityTo> fclList; // FacilityTo는 시설정보를 가지고 있다. 이름,시설종류,주소,전화번호 등..
public FclListAdapter(Context context, int textViewResourceId,
List<FacilityTo> objects) {
super(context, textViewResourceId, objects);
// TODO Auto-generated constructor stub
this.context = context;
this.fclList = objects;
}
// listview 의 한 item(row)을 출력할경우 호출된다.
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
// 뷰가 없으면 새로 만들고..
if(row == null) {
LayoutInflater inflator = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflator.inflate(R.layout.facility_list_item, null);
}
// 리스트에서 해당 시설정보를 가져온다.
final FacilityTo to = fclList.get(position);
if(to!=null) {
// 표시될 값 세팅.
TextView tvFclName = (TextView)row.findViewById(R.id.tvItemFName);
tvFclName.setText(to.getName()+” (“+to.getType()+”)”);
TextView tvFclAddr = (TextView)row.findViewById(R.id.tvItemFAddr);
tvFclAddr.setText(to.getAddr());
}
return(row);
}
public FacilityTo getFacilityTo(int position) {
return fclList.get(position);
}
}
// Activity 상 버튼들의 이벤트 핸들러 일단 검색버튼만 처리한다.
OnClickListener actvtOnClickLsnr = new OnClickListener () {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch(v.getId()) {
case R.id.btnSearch :
showFacilityList();
break;
}
}
};
// 검색실행.. 실제 listview를 표시한다.
protected void showFacilityList() {
ArrayList<FacilityTo> res;
// 결과를 검색한다. (원래는 where절 추가해서 검색하는데… 여기선 생략)
res = (ArrayList<FacilityTo>)fclDao.get();
if(res!=null) {
// 검색결과가 있으면 Adapter를 생성해서.. listview에 세팅해준다.
fclLstAdpt = new FclListAdapter(FacilityListActivity.this, R.layout.facility_list_item, res);
lvFclList.setAdapter(fclLstAdpt);
} else {
lvFclList.setAdapter(null);
}
}