오늘은 안드로이드에서 가장? 자주쓰이는 것중 하나인 리스트뷰를 커스텀해서 만들어 보겠습니다.
리스트뷰는 안드로이드어플을 만들어 보신분들이라면 한번이상은 만들어 보셨을 것이고, 어플을 만들 계획에 있으신분들도 리스트뷰는 한번이상 만들어 볼것입니다.
이 리스트뷰를 커스텀해서 하나의 로우에 내가 원하는 디자인, 아이템을 넣을 수 있습니다.
커스텀 리스트뷰는 일반적인 리스트뷰에 어뎁터를 추가하여 내가 원하는 아이템을 리스트뷰에 넣어 줄 수 있습니다.
커스텀 리스트뷰를 사용하기위해선 리스트뷰레이아웃, 하나의 row 를 정의하는 레이아웃 이 필요합니다.
row 레이아웃에서는 리스트뷰 의 row 를 개발자가 원하는대로 디자인하여 리스트뷰에 적용 할 수 있습니다.
java class 파일로는 Main 제외 Adapter 를 정의하는 class 하나, 리스트뷰의 row에 들어가는 아이템(텍스트라던지, 이미지라던지 .. ) 을 정의하는 class 하나가 필요합니다.
그럼 간단한 커스텀 리스트뷰를 만들어 보겠습니다.
본 예제에서는
Class
ListViewAdapter = 커스텀 리스트뷰를 만드는 adapter, 리스트뷰에 목록을 add, clear 하는 함수와 포지션 count, id 등 을 알 수 있다.
ListViewItem = 리스트뷰 하나의 row 에 들어가는 아이템을 정의한 class // 예제에서는 두개의 textview 를 좌우로 사용하였습니다. 만드시는 분에따라 이미지 등을 넣고 위치도 변경 하시면 됩니다.
MainActivity = 리스트뷰, 어뎁터, 클릭리스너 등 초기값 초기화, main
lauout
activity_main = 리스트뷰
listitemrow = 리스트뷰 하나의 로우를 만든 레이아웃
이렇게 다섯개의 파일이 필요합니다. 하나씩 알아 보겠습니다.
1. ListViewAdapter
public class ListViewAdapter extends BaseAdapter {
public ArrayList<ListViewItem> listViewItemList = new ArrayList<ListViewItem>();
@Override
public int getCount() {
return listViewItemList.size();
}
@Override
public Object getItem(int position) {
return listViewItemList.get(position) ;
}
@Override
public long getItemId(int position) {
return position ;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final int pos = position;
final Context context = parent.getContext();
// "listview_item" Layout을 inflate하여 convertView 참조 획득.
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.listitemrow, parent, false);
}
// 화면에 표시될 View(Layout이 inflate된)으로부터 위젯에 대한 참조 획득
TextView textView1 = (TextView) convertView.findViewById(R.id.textView1);
TextView textView2 = (TextView) convertView.findViewById(R.id.textView2);
// Data Set(filteredItemList)에서 position에 위치한 데이터 참조 획득
ListViewItem listViewItem = listViewItemList.get(position);
textView1.setText(listViewItem.getRowtext1());
textView2.setText(listViewItem.getRowtext2());
return convertView;
}
public void addItem(String text1, String text2) {
ListViewItem item = new ListViewItem();
item.setRowtext1(text1);
item.setRowtext2(text2);
listViewItemList.add(item);
}
public void clearItem(){
listViewItemList.clear();
}
}
어뎁터에는 row 레이아웃을 참조하여 row레이아웃 안에있는 아이템들에 additem 으로 가져온 값을 넣어줍니다.
2. ListViewItem
public class ListViewItem {
private String rowtext1;
private String rowtext2;
public String getRowtext1() {
return rowtext1;
}
public void setRowtext1(String rowtext1) {
this.rowtext1 = rowtext1;
}
public String getRowtext2() {
return rowtext2;
}
public void setRowtext2(String rowtext2) {
this.rowtext2 = rowtext2;
}
}
Item클래스는 row의 아이템을 정의하는 class입니다
3. MainActivity
public class MainActivity extends Activity{
private ListView listView;
private ListViewAdapter listViewAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//리스트뷰, 리스트뷰 어뎁터 초기화
listView = (ListView)findViewById(R.id.listview);
listViewAdapter = new ListViewAdapter();
//어뎁터에 아이템 추가
listViewAdapter.addItem("첫번째 row아이템1","첫번째 row아이템2");
listViewAdapter.addItem("두번째 row아이템1","첫번째 row아이템2");
for(int i = 0 ; i < 3 ; i ++){
listViewAdapter.addItem(i+"for문 + row아이템1",i+"for문 + row아이템2");
}
//리스트뷰에 어뎁터 set
listView.setAdapter(listViewAdapter);
}
}
메인입니다. MainActivity 에서는 어뎁터와 사용할 리스트뷰를 정의하고, 어뎁터에 추가할 item 을 add 한 뒤 리스트뷰에 set해주면 됩니다.
4. activity_main
메인 엑티비티는 리스트뷰 하나만 있습니다.
5. listitemrow
아이템 로우는 텍스트뷰 두개를 선언하였습니다. (id textview1, textview2)
실행화면입니다.
리스트뷰는 안드로이드 개발에있어 가장 자주 쓰이는 것 중 하나입니다.
리스트뷰를 커스텀하는 방법을익혀두면 어디서든 유용하게 사용 할 수 있을겁니다!!
'Android' 카테고리의 다른 글
[Android]WEB-안드로이드 이미지 캐시문제 (0) | 2018.05.24 |
---|---|
[안드로이드]그래프 만들기(MPAndroidChart) (2) | 2017.11.27 |
[안드로이드]퀵액션(QuickAction)(말풍선버튼) (3) | 2017.09.06 |
[안드로이드]xml파싱(xml parser) (6) | 2017.09.04 |
[안드로이드]JSON파싱(json parser) (8) | 2017.09.04 |