커스텀 리스트뷰
안드로이드에서는 리스트뷰라는게 있다. 바로 카카오톡의 친구리스트 같은 것들이다.
안드로이드에서 기본 제공하는 리스트들도 있지만 내가 직접 커스텀하여 사용할 수도 있다.
커스텀 리스트뷰의 필요 항목
먼저 화면에 보여질 xml파일과 그 리스트에 뿌려질 데이터클래스, 본 화면과 연결할 Adapter가 필요하다.
--myitem.xml--
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView3"
android:layout_width="200dp"
android:layout_height="50dp"
android:layout_weight="1"
android:textColorLink="@android:color/holo_blue_dark" />
</LinearLayout>
위와 같이 간단히 텍스트만 나오는 뷰이다.
-- BusStationVO.java --
public class BusStationVO {
private String stationId;
private String busRouteId;
private String stationNm;
private String busRouteNm;
private String station_X;
private String station_Y;
private String stationNum;
private String ord;
public String getStationId() {
return stationId;
}
public void setStationId(String stationId) {
this.stationId = stationId;
}
public String getBusRouteId() {
return busRouteId;
}
public void setBusRouteId(String busRouteId) {
this.busRouteId = busRouteId;
}
public String getStationNm() {
return stationNm;
}
public void setStationNm(String stationNm) {
this.stationNm = stationNm;
}
public String getBusRouteNm() {
return busRouteNm;
}
public void setBusRouteNm(String busRouteNm) {
this.busRouteNm = busRouteNm;
}
public String getStation_X() {
return station_X;
}
public void setStation_X(String station_X) {
this.station_X = station_X;
}
public String getStation_Y() {
return station_Y;
}
public void setStation_Y(String station_Y) {
this.station_Y = station_Y;
}
public String getStationNum() {
return stationNum;
}
public void setStationNum(String stationNum) {
this.stationNum = stationNum;
}
public String getOrd() {
return ord;
}
public void setOrd(String ord) {
this.ord = ord;
}
}
이건 그냥 내가 사용할 데이터 형태이다. 여기서 BusRouteNm 필드를 리스트에 뿌려줄 생각이다.
-- MyListViewAdapter
public class MyListViewAdapter extends BaseAdapter {
private List<BusStationVO> listViewItemList = new ArrayList<>();
@Override
public int getCount() {
return listViewItemList.size();
}
@Override
public Object getItem(int i) {
return listViewItemList.get(i) ;
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
final int pos = i;
final Context context = viewGroup.getContext();
// "listview_item" Layout을 inflate하여 convertView 참조 획득.
if (view == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.myitem, viewGroup, false);
}
TextView txt = (TextView)view.findViewById(R.id.textView3);
BusStationVO myItem = listViewItemList.get(i);
txt.setText(myItem.getStationNm());
return view;
}
// 아이템 데이터 추가를 위한 함수. 개발자가 원하는대로 작성 가능.
public void addItem(BusStationVO vo) {
BusStationVO item = new BusStationVO();
item = vo;
listViewItemList.add(item);
}
}
이건 본 화면의 리스트뷰와 내가 새로 만든 xml을 연결해줄 Adapter이다.
그럼 메인 액티비티에서
ListView listView; 로 리스트뷰를 생성해준다.
private MyListViewAdapter myListViewAdapter; 를 하나 생성해준다.
그 후에 listView 의 인스턴스를 생성해준다.
또 아래의 메서드를 통해 adapter를 생성해준다. 나는 그 아답터에 나의 데이터들을 담아주었다.
protected void initAdapter(List<BusStationVO> list) {
myListViewAdapter = new MyListViewAdapter();
for(int i = 0 ; i < list.size(); i++) {
myListViewAdapter.addItem(list.get(i));
}
}
그 후에 listView.setAdapter(myListViewAdapter); 를 통해 아답터를 연결해주면 끝이다~~.