[android] ListView 사용하기 (Custom Adapter 사용)

저번 프로그램을 개발하면서.. ListView를 써볼일이 있었는데..

나중에 참고하려고 정리해둔다는걸.. 미루다..

지금다시 정리하려고 하니, 기억이 잘 안난다는.. ㅠ.ㅠ

그래도 일단 몇줄 적어놓는다.

일단 완성화면

device-2013-03-17-185518.png

일단.. 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);

}

}

// ListView 의 Item을 클릭했을 때  이벤트 핸들러  시설에 대한 간단한 정보를 뿌리고, 상세보기 화면으로 갈수있게 한다.
OnItemClickListener fclListOnItemClickLsnr = new OnItemClickListener () {
@Override
public void onItemClick(AdapterView<?> parentView, View clickedView, int position, 
long id) {
// TODO Auto-generated method stub
FacilityTo f = (FacilityTo)parentView.getItemAtPosition(position);
currFclIdx = String.valueOf(f.getId());
     AlertDialog.Builder alert = new AlertDialog.Builder(FacilityListActivity.this);
     alert.setTitle(f.getName());
               // 시설정보들을 모아서 안내문을 만든다.
     StringBuilder sb = new StringBuilder();
     sb.append(getResources().getString(R.string.txt_pop_fcl_type)).append(” “)
.append(f.getType()).append(“\n”)
.append(getResources().getString(R.string.txt_pop_fcl_tel)).append(” “)
.append(f.getTel()).append(“\n”)
.append(getResources().getString(R.string.txt_pop_fcl_addr)).append(” “)
.append(f.getAddr());
     alert.setMessage(sb.toString());
     alert.setPositiveButton(“상세보기”, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
showDetailInfo(currFclIdx);
}
});
     alert.setNeutralButton(“확인(닫기)”, new DialogInterface.OnClickListener() {
     public void onClick(DialogInterface dlg, int sumthin) {
     // 기본적으로 창이 닫히며, 추가작업은 없다.
     }
     });
    
     alert.show();
}
};
// 상세보기를 클릭했을 경우, 상세보기 Activity를 실행
protected void showDetailInfo(String fclIdx) {
// 상세보기 activity실행
Intent itent = new Intent(this, DetailInfoActivity.class);
// id를 넘겨준다.
itent.putExtra(“fcl_idx”,fclIdx);
startActivity(itent);
}
}
=================
일단.. 그냥 이렇게 마무리 하는걸로…
뭐 이렇게 써놔도 난 다음에 알아볼수 있겠지..
혹 설명이 부족해서 궁금한것 있으면 댓글다세요.. 아는 한도내에서 설명해드릴께요..^^

Loading