1. Spinner


스피너는 콤보박스라 불리는 선택위젯이다.

한 아이템이 텍스트 하나인 경우일 때 주로 쓰인다.


스피너는 <Spinner> 태그를 이용해 XML 레이아웃에 추가하고 어댑터를 만들어 설정한다.

Arrayadapter를 사용하면 여러 개의 데이터를 담아둘 수 있다.


안드로이드 SDK에서 제공하는 XML 레이아웃인 android.R.layout.simple_spinner_item을 이용하여 

간단하게 하나의 아이템을 위한 레이아웃을 나타낸다.


스피너는 이미 선택된 아이템이 보이는 뷰와 아이템을 선택하기 위해 보이는 뷰가 다르기 때문에 2개의 뷰가 필요하다.

선택하기 위해 보이는 뷰는 setDropDownResource 메서드를 이용하여 설정한다.



2. 실행 결과 화면


3. activity_main.xml


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
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context="com.tistory.qlyh8.pracitice.MainActivity"
    android:layout_margin="8dp"
    android:orientation="vertical">
 
   <TextView
       android:id="@+id/text"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_marginTop="50dp"
       android:textAlignment="center"
       android:text="선택하세요"/>
 
   <Spinner
       android:id="@+id/spinner"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_marginTop="40dp">
   </Spinner>
 
</LinearLayout>
 
cs



4. MainActivity.java


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
32
33
34
35
36
37
38
39
40
41
42
package com.tistory.qlyh8.pracitice;
 
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
 
public class MainActivity extends AppCompatActivity {
 
    TextView textView;
    Spinner spinner;
 
    String[] items = {"사과""배""바나나""딸기""포도"};
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = findViewById(R.id.text);
        spinner = findViewById(R.id.spinner);
 
        ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, items);
        arrayAdapter.setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item);
        spinner.setAdapter(arrayAdapter);
 
        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                textView.setText(items[position]);
            }
 
            @Override
            public void onNothingSelected(AdapterView<?> parent) {
                textView.setText("선택하세요");
            }
        });
    }
}
 
cs





출처: https://www.edwith.org/boostcourse-android/lecture/17058/

'Android' 카테고리의 다른 글

Android Studio와 Git 연동하기  (0) 2018.05.18
GridView (그리드뷰)  (0) 2018.05.07
ListView (리스트뷰) - 예제  (0) 2018.05.06
ListView (리스트뷰)  (0) 2018.05.06
Inflation (인플레이션)  (0) 2018.05.01

1. 실행 결과 화면


  



2. activity_main.xml


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
32
33
34
35
36
37
38
39
40
41
42
43
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context="com.tistory.qlyh8.pracitice.MainActivity"
    android:layout_margin="8dp"
    android:orientation="vertical">
 
   <LinearLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:orientation="horizontal">
      <EditText
          android:id="@+id/edit_text_name"
          android:layout_width="0dp"
          android:layout_height="wrap_content"
          android:layout_weight="1"
          android:hint="이름"/>
      <EditText
          android:id="@+id/edit_text_number"
          android:layout_width="0dp"
          android:layout_height="wrap_content"
          android:layout_weight="1"
          android:hint="전화번호"
          android:layout_marginLeft="8dp"/>
   </LinearLayout>
 
   <Button
       android:id="@+id/btn_add"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:text="추가하기"/>
 
   <ListView
       android:id="@+id/list_view"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_marginTop="8dp"/>
 
</LinearLayout>
 
cs



3. list_item.xml


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
32
33
34
35
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">
 
    <ImageView
        android:id="@+id/item_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/list_item1"/>
 
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:orientation="vertical">
        <TextView
            android:id="@+id/item_name"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:textSize="20sp"
            android:textStyle="bold"/>
        <TextView
            android:id="@+id/item_number"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:textSize="18sp"/>
    </LinearLayout>
</LinearLayout>
 
cs



4. ListItem.java


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
32
33
34
35
36
37
38
package com.tistory.qlyh8.pracitice;
 
public class ListItem {
 
    private String name, number;
    private int imgId;
 
    public ListItem(String name, String number, int imgId) {
        this.name  = name;
        this.number = number;
        this.imgId = imgId;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getNumber() {
        return number;
    }
 
    public void setNumber(String number) {
        this.number = number;
    }
 
    public int getImgId() {
        return imgId;
    }
 
    public void setImgId(int imgId) {
        this.imgId = imgId;
    }
}
 
cs



5. ListItemView.java


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package com.tistory.qlyh8.pracitice;
 
 
import android.content.Context;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
 
public class ListItemView extends LinearLayout {
 
    ImageView imageView;
    TextView textViewName, textViewNumber;
 
    public ListItemView(Context context) {
        super(context);
        init(context);
    }
 
    public ListItemView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }
 
    public void init(Context context){
        LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        layoutInflater.inflate(R.layout.list_item, thistrue);
 
        textViewName = findViewById(R.id.item_name);
        textViewNumber = findViewById(R.id.item_number);
        imageView = findViewById(R.id.item_image);
    }
 
    public void setName(String str){
        textViewName.setText(str);
    }
 
    public void setNumber(String str){
        textViewNumber.setText(str);
    }
 
    public void setImageView(int imgId){
        imageView.setImageResource(imgId);
    }
}
 
cs



6. MainActivity.java


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package com.tistory.qlyh8.pracitice;
 
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
 
import java.util.ArrayList;
 
public class MainActivity extends AppCompatActivity {
 
    ListView listView;
    ListAdapter listAdapter;
    EditText editTextName, editTextNumber;
    Button button;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView = findViewById(R.id.list_view);
        editTextName = findViewById(R.id.edit_text_name);
        editTextNumber = findViewById(R.id.edit_text_number);
        button = findViewById(R.id.btn_add);
 
        listAdapter = new ListAdapter();
        listAdapter.addItem(new ListItem("김철수""010-1111-1111", R.drawable.list_item1));
        listAdapter.addItem(new ListItem("이나라""010-2222-2222", R.drawable.list_item2));
        listAdapter.addItem(new ListItem("신원호""010-3333-3333", R.drawable.list_item3));
        listAdapter.addItem(new ListItem("정나정""010-4444-4444", R.drawable.list_item4));
        listAdapter.addItem(new ListItem("이지윤""010-5555-5555", R.drawable.list_item5));
        listView.setAdapter(listAdapter);
 
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                ListItem item = (ListItem) listAdapter.getItem(position);
                Toast.makeText(getApplication(), item.getName(), Toast.LENGTH_SHORT).show();
            }
        });
 
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String name = editTextName.getText().toString();
                String number = editTextNumber.getText().toString();
 
                listAdapter.addItem(new ListItem(name, number, R.drawable.list_item1));
                listAdapter.notifyDataSetChanged();
            }
        });
    }
 
    class ListAdapter extends BaseAdapter {
 
        ArrayList<ListItem> listItem = new ArrayList<>();
 
        public void addItem(ListItem item){
            listItem.add(item);
        }
 
        @Override
        public int getCount() {
            return listItem.size();
        }
 
        @Override
        public Object getItem(int position) {
            return listItem.get(position);
        }
 
        @Override
        public long getItemId(int position) {
            return position;
        }
 
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // 화면에 보이지 않는 뷰를 다시 재사용할 수 있게 하여 데이터를 모두 생성할 필요 없게 한다.
            ListItemView listItemView = null;
            if(convertView == null)
                    listItemView = new ListItemView(getApplicationContext());
            else
                listItemView = (ListItemView) convertView;  // convertView: 이전에 썼던 뷰
 
            ListItem item = listItem.get(position);
 
            listItemView.setName(item.getName());
            listItemView.setNumber(item.getNumber());
            listItemView.setImageView(item.getImgId());
 
            return listItemView;
        }
    }
}
 
cs



** 참고


리스트에 이미지가 있는 경우에 부드럽게 처리하는 방법

https://developer.android.com/training/improving-layouts/smooth-scrolling


안드로이드 공식 리스트뷰 소개

https://developer.android.com/guide/topics/ui/layout/listview?hl=ko





출처: https://www.edwith.org/boostcourse-android/lecture/17057/

'Android' 카테고리의 다른 글

GridView (그리드뷰)  (0) 2018.05.07
Spinner (스피너)  (0) 2018.05.07
ListView (리스트뷰)  (0) 2018.05.06
Inflation (인플레이션)  (0) 2018.05.01
Bitmap Button 만들기  (0) 2018.05.01

1. Selection Widget

 

선택 위젯이란 여러 개의 아이템 중에서 하나를 선택하는 방식의 위젯을 말한다.

대표적인 선택 위젯으로 리스트뷰, 스피너, 그리드뷰, 갤러리 등이 있다.


선택 위젯은 원본 데이터를 위젯에 직접 설정하지 않고 어댑터라는 클래스를 사용하도록 되어있다. 

어댑터는 이 원본 데이터를 관리하고, 위젯을 통해 보일 각각의 아이템을 위해 뷰를 생성한다.



2. ListView 란


리스트뷰는 각각의 아이템을 순서대로 보여주는 역할을 한다.

각각의 아이템은 독립적인 뷰로 만들어지게 되고 이 뷰들이 모여있는 형태를 유지해 주는 것이 리스트뷰이다. 


주의할 점은 위에서 언급했듯이, 리스트 아이템의 데이터는 리스트뷰가 관리하는 것이 아니라 어댑터에서 관리한다는 것이다.

어댑터를 리스트뷰에 설정하면 리스트뷰는 어댑터에게 데이터나 각각의 아이템을 위한 뷰에 관해 물어보게 된다.


각각의 아이템을 위한 뷰도 어댑터에서 만들어주기 때문에 리스트뷰는 어댑터의 getView 메소드를 호출하여 뷰 객체를 반환받은 후 화면에 보여주게 된다.



3. ListView 과정


1. 리스트뷰 정의

 : 화면에 보여줄 리스트뷰를 만들고 그 안에 데이터가 선택되었을 때 호출될 리스너 객체를 정의한다.


2. 어댑터 정의

 : 데이터 관리 역할을 하는 어댑터 클래스를 만들고 그 안에 각 아이템으로 표시할 뷰를 리턴하는 getView()를 정의한다.


3. 아이템을 위한 XML 레이아웃 정의


4. 아이템을 위한 뷰 정의

 : 이것은 부분화면 같아서, 아이템을 위한 XML 레이아웃을 인플레이션 후 설정해야 한다.



** Context

컨텍스트란 어플리케이션에 대한 전역 정보를 담은 객체를 의미한다.

어플리케이션에 관하여 시스템이 관리하고 있는 정보에 접근 (ex: getPackageName(), getReSource())하거나

안드로이드 시스템 서비스에서 제공하는 API를 호출(ex: StartActivity, bindService())할 수 있다.


출처: https://blog.naver.com/thejunyt/221067173370



** Application Context & Activity Context

Application Context 와 Activity Context 는 미묘한 차이는 있는데 사실상 같다고 보면 된다. 

어플리케이션 컨텍스트는 앱이 실행되는 동안 유지되는 컨텍스트이고, 액티비티 컨텍스트는 액티비티 생명주기랑 함께 한다.

어플리케이션 전체에서 싱글턴으로 사용되면서 Context 를 필요로 하는 객체가 있을때 getApplicationContext 를 사용하는게 좋고, 나머지는 this 쓰는게 좋다. 싱글턴에 액티비티.this 던지면 액티비티가 Memory Leak이 발생할 수 있다.



** Singleton Pattern

: 디자인 패턴 중 하나로, 특정 클래스의 인스턴스가 오직 하나임을 보장하고 어디서든지 그 인스턴스에 접근할 수 있도록 하는 패턴을 말한다. 클래스가 있으면 인스턴스를 무조건 하나만 만들 수 있고, 이 객체는 한번만 생성이 가능하다.





출처: https://www.edwith.org/boostcourse-android/lecture/17057/

'Android' 카테고리의 다른 글

Spinner (스피너)  (0) 2018.05.07
ListView (리스트뷰) - 예제  (0) 2018.05.06
Inflation (인플레이션)  (0) 2018.05.01
Bitmap Button 만들기  (0) 2018.05.01
Nine Patch (나인패치)  (0) 2018.05.01

+ Recent posts