Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

기록장

[안드로이드] ListView(리스트뷰) 본문

안드로이드

[안드로이드] ListView(리스트뷰)

edit0 2021. 1. 12. 17:54

ListView는 데이터 목록들을 하나의 ViewGroup 안에 넣어서 목록을 리스트형식으로 보여주는 역할을 한다.

* ViewGroup은 말그대로 View들의 그룹이다. View가 여러개 있다는 것이다.

 

리스트뷰를 사용하기 위해서는 Adapter란게 필요하다. 이 어댑터는 데이터 목록들을 각 View로 만들어주고 이 View들을 ViewGroup에 넣어준 뒤 데이터 목록들을 각각 보여주는 역할을 한다.

 

출처 https://re-build.tistory.com/19

 

리스트뷰 구성으로는 사용자 메인 액티비티와 어댑터 아이템을 저장할 클래스(아이템 목록) 정도이다.

 

사용자는 메인 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;
    }
}

 

결과

 

 

아이템 항목 누를 시

 

 

부족한 점, 피드백 환영합니다.

 

감사합니다.