본문으로 바로가기

[안드로이드]커스텀리스트뷰(listview)

category Android 2017. 11. 22. 11:57

오늘은 안드로이드에서 가장? 자주쓰이는 것중 하나인 리스트뷰를 커스텀해서 만들어 보겠습니다.


리스트뷰는 안드로이드어플을 만들어 보신분들이라면 한번이상은 만들어 보셨을 것이고, 어플을 만들 계획에 있으신분들도 리스트뷰는 한번이상 만들어 볼것입니다.


이 리스트뷰를 커스텀해서 하나의 로우에 내가 원하는 디자인, 아이템을 넣을 수 있습니다.



커스텀 리스트뷰는 일반적인 리스트뷰에 어뎁터를 추가하여 내가 원하는 아이템을 리스트뷰에 넣어 줄 수 있습니다.



커스텀 리스트뷰를 사용하기위해선 리스트뷰레이아웃, 하나의 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)



실행화면입니다.



리스트뷰는 안드로이드 개발에있어 가장 자주 쓰이는 것 중 하나입니다.


리스트뷰를 커스텀하는 방법을익혀두면 어디서든 유용하게 사용 할 수 있을겁니다!!