android-lecture

android lecture notes

View on GitHub

layout: true .top-line[]


class: center, middle

어댑터 뷰


Contents


어댑터 뷰

<img src=”images/adapter.png” width=90%>


어댑터(Adapter)

<img src=”images/adapter2.png” width=90% style=”display:block; margin: auto;”>


어댑터 종류

.left-column-50[

.right-column-50[ <img src=”images/adapterclass.png” width=90%> ]

???


리스트 뷰 (ListView)


리스트 뷰:XML 레이아웃에 ListView 정의

<?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">

*   <ListView
*       android:id="@+id/listView"
*       android:layout_width="match_parent"
*       android:layout_height="match_parent"
*      />
</LinearLayout>

.footnote[https://https://github.com/kwanu70/AndroidExamples/blob/master/chap3/ListViewTest/app/src/main/res/layout/activity_main.xml]


리스트 뷰:어댑터 준비

리소스 ID 설명
android.R.layout.simple_list_item_1 하나의 텍스트 뷰로 구성된 레이아웃
android.R.layout.simple_list_item_2 두 개의 텍스트 뷰로 구성된 레이아웃
android.R.layout.simple_list_item_checked 오른쪽에 체크 표시가 나타난다.
android.R.layout.simple_list_item_single_choice 오른쪽에 라디오 버튼이 나타난다.
android.R.layout.simple_lsit_item_multiple_choice 오른쪽에 체크 버튼이 나타난다.

.center[시스템이 목록 표시용으로 미리 정의해 놓은 textViewResourceId]


ListView 예제

public class MainActivity extends AppCompatActivity {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 데이터 원본 준비
*        String[] items = {"item1", "item2", "item3",
                            "item4","item5","item6","item7","item8"};

        //어댑터 생성
*       ArrayAdapter<String> adapt = new ArrayAdapter<String>(this,
                                android.R.layout.simple_list_item_1, items);

        //어댑터 연결
*       ListView list = (ListView) findViewById(R.id.listView);
        list.setAdapter(adapt);
}

.footnote[https://github.com/kwanu70/AndroidExamples/blob/master/chap3/ListViewTest/app/src/main/java/com/example/kwanwoo/listviewtest/MainActivity.java]


문자열 배열 리소스 사용법

item1 item2 item3 item4
- 리소스로부터 어댑터 생성  
```java
ArrayAdapter<CharSequence> adapt = ArrayAdapter.createFromResource(this,
                      R.array.items, android.R.layout.simple_list_item_1);

.footnote[https://github.com/kwanu70/AndroidExamples/blob/master/chap3/ListViewTest/app/src/main/res/values/arrays.xml]


항목을 위한 사용자 정의 TextView

- 템플릿 레이아웃(item.xml)을 이용하여 ArrayAdapter 준비  
```java
ArrayAdapter<String> adapt = new ArrayAdapter<String>(this, R.layout.item, items);

.footnote[https://github.com/kwanu70/AndroidExamples/blob/master/chap3/ListViewTest/app/src/main/res/layout/item.xml]


커스텀 어댑터

  • 어댑터 뷰의 항목 하나는 단순한 문자열 이나 이미지 뿐만 아니라, 임의의 뷰가 될 수 있음.
  • 커스텀 어댑터 설정 절차
    1. 항목을 위한 XML 레이아웃 정의
    2. 커스텀 어댑터 정의
    3. 어댑터를 생성하고 어댑터 뷰 객체에 연결

커스텀 어댑터: 항목 XML 레이아웃 정의

<?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="wrap_content"
    android:orientation="horizontal"
    >
*   <ImageView
        android:id="@+id/iconItem"
        android:layout_width="@dimen/icon_size"
        android:layout_height="@dimen/icon_size"
        android:scaleType="centerInside"
        android:padding="@dimen/icon_padding"
        android:layout_gravity="center_vertical"
        android:layout_weight="1"
        />

.footnote[https://github.com/kwanu70/AndroidExamples/blob/master/chap3/CustomAdapterTest/app/src/main/res/layout/item.xml]


커스텀 어댑터: 항목 XML 레이아웃 정의 (계속)

*   <LinearLayout
       android:orientation="vertical"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_weight="2">
*      <TextView
           android:id="@+id/textItem1"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:textColor="@color/colorAccent"
           android:textSize="@dimen/list_item_text_size1"
           android:padding="@dimen/list_item_padding"
           />
*      <TextView
           android:id="@+id/textItem2"
           ...생략...
           />
    </LinearLayout>
</LinearLayout>

.footnote[https://github.com/kwanu70/AndroidExamples/blob/master/chap3/CustomAdapterTest/app/src/main/res/layout/item.xml]


커스텀 어댑터: 어댑터 정의

class MyItem {
    int mIcon; // image resource
    String nName; // text
    String nAge;  // text
    MyItem(int aIcon, String aName, String aAge) { mIcon = aIcon; nName = aName; nAge = aAge; }
}

class MyAdapter extends BaseAdapter {
    private Context mContext;
    private int mResource;
*   private ArrayList<MyItem> mItems = new ArrayList<MyItem>();

    public MyAdapter(Context context, int resource, ArrayList<MyItem> items) {
        mContext = context;
        mItems = items;
        mResource = resource;
    }
*   public int getCount() { return mItems.size(); }
*   public Object getItem(int position) { return mItems.get(position); }
    public long getItemId(int position) { return position;}

.footnote[https://github.com/kwanu70/AndroidExamples/blob/master/chap3/CustomAdapterTest/app/src/main/java/com/example/kwanwoo/customadaptertest/MyAdapter.java ]


커스텀 어댑터: 어댑터 정의 (계속)

    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            LayoutInflater inflater =
                 (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
*           convertView = inflater.inflate(mResource, parent,false);
        }
        // Set Icon
*       ImageView icon = (ImageView) convertView.findViewById(R.id.iconItem);
*       icon.setImageResource(mItems.get(position).mIcon);

        // Set Text 01
*       TextView name = (TextView) convertView.findViewById(R.id.textItem1);
*       name.setText(mItems.get(position).nName);

        // Set Text 02
*       TextView age = (TextView) convertView.findViewById(R.id.textItem2);
*       age.setText(mItems.get(position).nAge);
        return convertView;
    }
}

.footnote[https://github.com/kwanu70/AndroidExamples/blob/master/chap3/CustomAdapterTest/app/src/main/java/com/example/kwanwoo/customadaptertest/MyAdapter.java ]


커스텀 어댑터: 어댑터 생성 및 연결

public class MainActivity extends AppCompatActivity {
    static MyAdapter adapter;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 데이터 원본 준비
*       ArrayList<MyItem> data = new ArrayList<MyItem>();
        data.add(new MyItem(R.drawable.sample_0, "Bella", "1"));
        data.add(new MyItem(R.drawable.sample_1, "Charlie", "2"));
        
        //어댑터 생성
*       adapter = new MyAdapter(this, R.layout.item, data);

        //어댑터 연결
        ListView list = (ListView) findViewById(R.id.listView);
*       list.setAdapter(adapt);
}

.footnote[https://github.com/kwanu70/AndroidExamples/blob/master/chap3/CustomAdapterTest/app/src/main/java/com/example/kwanwoo/customadaptertest/MainActivity.java]


항목 클릭 이벤트 처리

  • 어댑터 뷰의 항목이 클릭될 때, 호출되는 callback method의 인터페이스
    public static interface AdapterView.OnItemClickListener {
      abstract void onItemClick(AdapterView<?> parent,
                                               View view,
                                               int position,
                                               long id);
    }
    
파라미터 설명
parent 클릭 이벤트가 발생된 AdapterView
view 실제 클릭된 AdapterView안의 View
position 어댑터 내에서 클릭된 항목/뷰의 위치
id 클릭된 항목의 id

항목 클릭 이벤트 처리

adapter = new MyAdapter(this, R.layout.item, data);

...생략...

*listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View vClicked, int position, long id) {

         // 클릭된 뷰(vClicked)안에서 id가 textItem1인 텍스트뷰의 레이블을 얻어옴.
         // String name = (String)((TextView)vClicked.findViewById(R.id.textItem1)).getText();

         // 어댑터(adapter) 내의 position 위치의 항목의 nName 값을 읽어옴
         String name = ((MyItem)adapter.getItem(position)).nName;

         Toast.makeText(MainActivity.this, name + " selected", Toast.LENGTH_SHORT).show();
    }
});

.footnote[https://github.com/kwanu70/AndroidExamples/blob/master/chap3/CustomAdapterTest/app/src/main/java/com/example/kwanwoo/customadaptertest/MyAdapter.java]