기록장
[안드로이드] ListView(리스트뷰) 본문
ListView는 데이터 목록들을 하나의 ViewGroup 안에 넣어서 목록을 리스트형식으로 보여주는 역할을 한다.
* ViewGroup은 말그대로 View들의 그룹이다. View가 여러개 있다는 것이다.
리스트뷰를 사용하기 위해서는 Adapter란게 필요하다. 이 어댑터는 데이터 목록들을 각 View로 만들어주고 이 View들을 ViewGroup에 넣어준 뒤 데이터 목록들을 각각 보여주는 역할을 한다.
리스트뷰 구성으로는 사용자 메인 액티비티와 어댑터 아이템을 저장할 클래스(아이템 목록) 정도이다.
사용자는 메인 xml에서 리스트뷰를 포함한 다른 위젯들을 사용하여 화면을 구성할 수 있다.
어댑터 xml에서는 메인 액티비티 내 리스트 안에 나올 아이템 목록들을 어떻게 보여줄지 구성한다.
바로 코드를 보며 설명을 하도록 하겠다.
코드
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<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"
tools:context=".MainActivity"
android:orientation="vertical">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/edittext1"
android:hint="이름"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/edittext2"
android:hint="내용"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/button1"
android:text="입력"/>
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/listview"/>
</LinearLayout>
이름과 내용을 입력받아서 버튼을 누르면 리스트뷰에 추가되도록 만들기 위해 다른 위젯도 넣었다.
MainActivity.java
public class MainActivity extends AppCompatActivity {
ListView listView;
adapter connection_adapter;
ArrayList<list> list = new ArrayList<>(); //아이템 항목 클래스를 ArrayList로 생성
//아이템 하나의 목록에 대한 데이터를 받으면 그것을 저장하기 위해 생성
//아래 아이템 항목 클래스인 list.class를 객체로 생성해 이 ArrayList에 넣어줄 것 이다.
Button b1;
EditText et1, et2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = findViewById(R.id.listview);
connection_adapter = new adapter(this, list); //어댑터 클래스 객체 생성
// 어댑터 클래스의 생성자 파라미터 Context, 아이템 항목 클래스의 ArrayList)
listView.setAdapter(connection_adapter); //리스트튜에 어댑터 장착
et1 = findViewById(R.id.edittext1);
et2 = findViewById(R.id.edittext2);
b1 = findViewById(R.id.button1);
//리스트뷰 내의 아이템 항목을 눌렀을 경우
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(getApplicationContext(), list.get(position).getName() + "\n" + list.get(position).getMemo(),Toast.LENGTH_SHORT).show();
list.remove(position); //리스트에서 누른 아이템 항목 삭제
connection_adapter.notifyDataSetChanged(); //리스트뷰 갱신
}
});
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
list save_data = new list(); //list 클래스는 아이템 항목 클래스이다.
save_data.setName(et1.getText().toString()); //set 메소드로 데이터 설정
save_data.setMemo(et2.getText().toString()); //마찬가지
list.add(save_data); //설정한 데이터를 아까 위에서 list를 ArrayList로 선언하였던 변수에 add 해준다.
connection_adapter.notifyDataSetChanged(); //리스트뷰 갱신
}
});
}
}
activity_adapter.xml
<?xml version="1.0" encoding="utf-8"?>
<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="wrap_content"
tools:context=".adapter"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:layout_width="80dp"
android:layout_height="80dp"
android:src="@drawable/ic_launcher_foreground"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:id="@+id/textview1"
android:textSize="30dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:textSize="20dp"
android:text="부서: 미정"/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_margin="10dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/textview2"
android:textSize="20dp"/>
</LinearLayout>
</LinearLayout>
아이템 항목의 xml
adapter.java
public class adapter extends BaseAdapter {
Context context = null;
ArrayList<list> list;
TextView tv1, tv2;
adapter(Context context, ArrayList<list> list){
this.context = context;
this.list = list;
}
//아이템 항목(리스트뷰에 들어가는 View) 갯수 반환
@Override
public int getCount() {
return list.size();
}
//position에 해당하는 아이템 항목을 객체로 반환
@Override
public Object getItem(int position) {
return list.get(position);
}
//position에 해당하는 아이템 항목의 ID(순서) 반환
@Override
public long getItemId(int position) {
return position;
}
//제일 중요한 부분
//리스트뷰에 보여줄 View 반환한다.
//아이템 항목을 구성할 View를 inflate해주고, 데이터를 가져와 셋팅해주고, View 반환
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View itemView = inflater.inflate(R.layout.activity_adapter, parent, false);
tv1 = itemView.findViewById(R.id.textview1);
tv2 = itemView.findViewById(R.id.textview2);
tv1.setText(list.get(position).getName());
tv2.setText(list.get(position).getMemo());
return itemView;
}
}
BaseAdapter를 상속받으면 이에 상응하는 메소드를 오버라이드하라고 뜰 것이다. 그 메소드들이 getCount(), getItem(), getItemId(), getView()이다. 생성자는 리스트뷰와 어댑터를 연결해주기 위해(메인 클래스에서 추가한 데이터를 어댑터 클래스로 보내줘서 그 데이터를 어댑터.xml에 설정해주고 View를 반환하여 화면에 보여지도록 하는 개념이다) 필요하다.
마지막으로 아이템 항목을 구성하는 클래스
난 이름과 메모 내용만 받으므로 name과 memo를 저장할 변수, set, get 메소드를 만들어줬다.
list.java
public class list {
String name;
String memo;
public String getName() {
return name;
}
public String getMemo() {
return memo;
}
public void setName(String name) {
this.name = name;
}
public void setMemo(String memo) {
this.memo = memo;
}
}
결과
아이템 항목 누를 시
부족한 점, 피드백 환영합니다.
감사합니다.
'안드로이드' 카테고리의 다른 글
[안드로이드] Service(서비스) 이해하기 (0) | 2021.01.13 |
---|---|
[안드로이드] RecyclerView(리사이클러뷰) (0) | 2021.01.12 |
[안드로이드] Volley(볼리) 통신 / RequestQueue (0) | 2021.01.09 |
[안드로이드] 웹, HTTP 통신, 공공데이터 API, JSON 파일 데이터 가져오기 / HttpURLConnection, JSON Parsing(제이슨 파싱), 공공데이터포털 (0) | 2021.01.08 |
[안드로이드] 네트워킹, Socket (소켓) (0) | 2021.01.07 |