Android

ListView 사용법

PJH 2021. 3. 2. 23:37

1. ListView를 사용하기 위해서는 ListView를 랜더링하기 위한 xml 파일이 필요하다.

 

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:layout_gravity="left">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="이름 : "
            android:textSize="25dp"
            android:textColor="#000000"/>
        <TextView
            android:id="@+id/listViewTextName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="홍길동"
            android:textSize="25dp"
            android:textColor="#000000"/>
    </LinearLayout>
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:layout_gravity="left">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="전화번호 : "
            android:textSize="25dp"
            android:textColor="#000000"/>
        <TextView
            android:id="@+id/listViewTextPhoneNum"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="010-1234-1234"
            android:textSize="25dp"
            android:textColor="#000000"/>
    </LinearLayout>
</LinearLayout>

 

 

 

2. 리스트뷰를 쓰기 위한 Adapter

 

Adapter는 BaseAdapter를 상속받아서 구현해야 한다. 원형은 다음과 같다.

 

public class MyAdapter extends BaseAdapter{

    @Override
    public int getCount() { return 0; }

    @Override
    public Object getItem(int position) { return null; }

    @Override
    public long getItemId(int position) { return 0; }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) { return null; }
}

 

 

예제 샘플에 맞게 구현할 코드는 다음과 같다.

 

public class MyAdapter extends BaseAdapter{

    private LayoutInflater layoutInflater;
    private Context context;
    private ArrayList<Data> myList;


    public MyAdapter(Context context, ArrayList<Data> myList){
        this.context=context;
        this.myList=myList;
        this.layoutInflater = LayoutInflater.from(this.context);
    }

    //--------------------------------
    // 현재 리스트의 갯수를 받아온다.
    //--------------------------------
    @Override
    public int getCount() { return myList.size(); }

    //--------------------------------
    // 리스트의 아이템 하나를 받아온다.
    //--------------------------------
    @Override
    public Data getItem(int position) { return myList.get(position); }

    //--------------------------------
    // 리스트의 인덱스를 받아온다.
    //--------------------------------
    @Override
    public long getItemId(int position) { return position; }

    //--------------------------------
    // 레이아웃 랜더링
    //--------------------------------
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = layoutInflater.inflate(R.layout.mylistview, null);

        //레이아웃 리소스의 위젯ID를 참조
        TextView textViewName = (TextView)view.findViewById(R.id.listViewTextName);
        TextView textViewPhoneNum = (TextView)view.findViewById(R.id.listViewTextPhoneNum);

        //레이아웃에서 받아온 데이터를 적용
        textViewName.setText(myList.get(position).getName());
        textViewPhoneNum.setText(myList.get(position).getPhoneNum());
        return view;
    }
}

 

 

3. 리스트뷰에서 담을 데이터가 필요하다.

 

public class Data {
    private String name;
    private String phoneNum;

    public String getName() { return name; }
    public void setName(String name) { this.name = name; }

    public String getPhoneNum(){ return this.phoneNum;}
    public void setPhoneNum(String phoneNum){ this.phoneNum = phoneNum; }

    public Data(String name, String phoneNum){
        this.name = name;
        this.phoneNum = phoneNum;
    }
}

 

 

 

4. 메인 화면

소스코드는 다음과 같다.

 

<?xml version="1.0" encoding="utf-8"?>

<!-- View -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="10dp"
            android:gravity="center">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="이름"
                android:textColor="#000000"/>
            <Space
                android:layout_width="30dp"
                android:layout_height="wrap_content"/>

            <EditText
                android:id="@+id/inputName"
                android:layout_width="200dp"
                android:layout_height="wrap_content"
                android:hint=" 예. 홍길동" />
        </LinearLayout>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="10dp"
            android:gravity="center">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="전화번호"
                android:textColor="#000000"/>
            <Space
                android:layout_width="5dp"
                android:layout_height="wrap_content"/>
            <EditText
                android:id="@+id/inputPhoneNum"
                android:layout_width="200dp"
                android:layout_height="wrap_content"
                android:hint=" 예.  010-1234-1234"/>
        </LinearLayout>
        <Button
            android:id="@+id/myBtn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Click me"
            android:onClick="onClickMyBtn"
            android:layout_gravity="center"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:gravity="center">
        <ListView
            android:id="@+id/phoneNumList"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    </LinearLayout>
</LinearLayout>

 

5. MainActivity

 

public class MainActivity extends AppCompatActivity {
    private EditText inputName;
    private EditText inputPhoneNum;
    private ListView listView;
    private ArrayList<Data> dataList;
    private Data data;

    /******************************
     * 시작지점
     ******************************/ 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initialize();
        onItemClickList();
    }

    /******************************
     * Event listView Item Click
     ******************************/
    public void onItemClickList(){
        final MyAdapter myAdapter = new MyAdapter(this, dataList);
        listView.setAdapter(myAdapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                //ex. 이름 : 홍길동
                String toastName = "이름 " + myAdapter.getItem(position).getName() + "\n";

                // ex. 전화번호 : 010-1234-1234
                String toastPhoneNum = "전화번호 : " + myAdapter.getItem(position).getPhoneNum();

                Toast.makeText(getApplicationContext(), toastName + toastPhoneNum, Toast.LENGTH_SHORT).show();
            }
        });
    }

    /******************************
     * 초기화 관련 작업
     ******************************/
    public void initialize(){
        dataList = new ArrayList<Data>();
        inputName=(EditText)findViewById(R.id.inputName);
        inputPhoneNum=(EditText)findViewById(R.id.inputPhoneNum);
        listView = (ListView)findViewById(R.id.phoneNumList);
    }

    /******************************
     * 버튼의 ID를 참조하지 않고 설정
     ******************************/
    public void onClickMyBtn(View v){
        dataList.add(new Data(inputName.getText().toString(), inputPhoneNum.getText().toString()));
    }
}

실행결과 화면이다.

데이터를 입력하고 CLICK ME를 누르면 데이터가 추가된다. (다만 뒤로가기 버튼을 한번 눌러야 한다.)