페이스북이나, 카카오톡 채팅방 같은 수많은 리스트들은 동적으로 생성이 된다.
이러한 리스트들이 어떻게 보여지는지 이번시간에 구현해보도록하겠다.
ListView란?
1개 이상의 리스트들을 보여지도록 설정하는 레이아웃으로 생각하자.
Adapter란?
ListView가 생성이 되면, 이 안에는 수 많은 데이터들이 저장이 될것이다.
어떤 레이아웃이 배치되고 그 안의 데이터는 어떤 데이터가 들어갈것인지 관리해주는 역할을 Adapter가 해준다.
이어서 코드를 통해 살펴보자
다음과 같은 ListView를 만들어보자.
- 여러 배경색이 있는 리스트 뷰. (실제 리스트는 3개만 존재하나, 리스트 뷰에는 100개가 보이는것처럼 보임)
- 리스트 클릭 시 정보들이 보임. (BaseAdapter를 사용함.)
1) activity_main.xml
- <?xml version="1.0" encoding="utf-8"?>
- <android.support.constraint.ConstraintLayout 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">
- <ListView
- android:id="@+id/lv"
- android:layout_width="match_parent"
- android:layout_height="wrap_content" />
- </android.support.constraint.ConstraintLayout>
2) list_view.xml
- <?xml version="1.0" encoding="utf-8"?>
- <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- xmlns:apps="http://schemas.android.com/apk/res-auto">
- <ImageView
- android:id="@+id/iv"
- android:layout_width="100dp"
- android:layout_height="100dp" />
- <TextView
- android:id="@+id/tv"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- apps:layout_constraintStart_toEndOf="@+id/iv"
- apps:layout_constraintTop_toTopOf="@+id/iv"
- apps:layout_constraintBottom_toBottomOf="@+id/iv"
- android:text="텍스트" />
- </android.support.constraint.ConstraintLayout>
3) MainActivity.java
- package com.example.rhkdg.myapplication;
- import android.graphics.Color;
- import android.support.v7.app.AppCompatActivity;
- import android.os.Bundle;
- import android.view.View;
- import android.widget.AdapterView;
- import android.widget.LinearLayout;
- import android.widget.ListView;
- import android.widget.Toast;
- import java.util.ArrayList;
- public class MainActivity extends AppCompatActivity {
- // 보여질 리스트뷰
- private ListView lv;
- // 리스트들의 안에 담을 데이터들을 저장함.
- private ArrayList<ListInfo> arrayList;
- private MyBaseAdapter adapter;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- lv = findViewById(R.id.lv);
- arrayList = new ArrayList<>();
- arrayList.add(new ListInfo("빨간색", Color.RED ));
- arrayList.add(new ListInfo("파란색", Color.BLUE));
- arrayList.add(new ListInfo("초록색", Color.GREEN));
- arrayList.add(new ListInfo("노란색", Color.YELLOW));
- // 어댑터를 지정.(각 리스트들의 정보들을 관리해주는 역할을 한다.)
- adapter = new MyBaseAdapter(this, arrayList);
- // 리스트 뷰의 어댑터를 지정한다.
- lv.setAdapter(adapter);
- // 클릭한 리스트의 데이터 정보반환.
- lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- toast(position + "번째 id = " + id);
- }
- });
- }
- public void toast(String msg){
- Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
- }
- }
4) MyBaseAdapter.java
- package com.example.rhkdg.myapplication;
- import android.content.Context;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.BaseAdapter;
- import android.widget.TextView;
- import java.util.ArrayList;
- public class MyBaseAdapter extends BaseAdapter {
- private ArrayList<ListInfo> data;
- private Context context;
- public MyBaseAdapter(Context context, ArrayList<ListInfo> data){
- this.context = context;
- this.data = data;
- }
- @Override
- public int getCount() {
- return 100; // 실제 데이터는 4개지만, 리스트 뷰가 100개인 것처럼 보임.
- }
- @Override
- public ListInfo getItem(int position) {
- position %= 4; // 0~3의 데이터의 포지션 값으로 지정해야함.
- return data.get(position);
- }
- @Override
- public long getItemId(int position) {
- return position;
- }
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- position %= 4; // 0~3의 데이터의 포지션 값으로 지정해야함.
- View v = LayoutInflater.from(context).inflate(R.layout.listview, null);
- v.findViewById(R.id.iv).setBackgroundColor(data.get(position).getColor());
- TextView tv = v.findViewById(R.id.tv);
- tv.setText(data.get(position).getTitle());
- return v;
- }
- }
5) ListInfo
- package com.example.rhkdg.myapplication;
- public class ListInfo {
- private String title;
- private int color;
- public ListInfo(String title, int color){
- this.title = title;
- this.color = color;
- }
- public String getTitle(){
- return this.title;
- }
- public int getColor(){
- return this.color;
- }
- }
▶ 실행화면
(1. 초기화면)
(1. 초기화면)
: 어댑터 뷰를 통해서 다양하게 리스트들의 데이터를 관리하는 방법에 대해서 살펴보았다.
다음에는 ListView의 단점을 보완한 RecyclerView에 대해서 살펴보자.
- ListView뷰의 단점
MyBaseAdapter부분의 getView()메소드를 보면, findViewById를 수 없이 하게 된다. findViewById는 앱의 성능을 저하시키므로, 이 작업을 시작할 때 미리 등록해 놓으면 이후 리스트를 스크롤할때마다 findViewById를 하지 않게된다. 이것을 보완해서 등장한것이 RecyclerView이다.
댓글 없음:
댓글 쓰기