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를 누르면 데이터가 추가된다. (다만 뒤로가기 버튼을 한번 눌러야 한다.)