●Adapter 재정의

- Adapter의 자식 개체중 ArrayAdapter는 단순한 텍스트만 보여주고자 할때 사용한다. 개발자가 정의한 복잡한 아이템 위젯은 지금가지 존재하지 않았던 새로운 위젯과 마찬가지이므로, ArrayAdapter가 보여줄 수 없다. 그래서 개발자가 직접 Adapter클래스를 상속받아 재정의해서 사용해야한다.







●예제


- FruitActivity.java

package com.example.day0321;


import java.util.ArrayList;


import android.app.Activity;

import android.os.Bundle;

import android.widget.ArrayAdapter;

import android.widget.ListView;


public class FruitActivity extends Activity{

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);


setContentView(R.layout.fruit_main);

ListView lv = (ListView)findViewById(R.id.lv);

             //개발자가 재정의한 Adapter이다.

MyAdapter adapter = new MyAdapter(this);

lv.setAdapter(adapter);

}

}





- MyAdapter.java

package com.example.day0321;


import java.util.ArrayList;


import android.content.Context;

import android.util.Log;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.webkit.WebView.FindListener;

import android.widget.BaseAdapter;

import android.widget.Button;

import android.widget.ImageView;

import android.widget.RelativeLayout;

import android.widget.TextView;


public class MyAdapter extends BaseAdapter{

Context context;

ArrayList lst = new ArrayList();

LayoutInflater inflater;

//생성자를 만든다.

public MyAdapter(Context context) {

lst.add("수박");

lst.add("귤");

lst.add("포도");

lst.add("키위");

lst.add("바나나");

lst.add("사과");

lst.add("딸기");

lst.add("토마토");

lst.add("레몬");

lst.add("망고");

lst.add("파인애플");

lst.add("방울토마토");

lst.add("메론");

//getSystemService은 Activity클래스의 메서드이다.

inflater = (LayoutInflater)context.getSystemService(context.LAYOUT_INFLATER_SERVICE);


}

//아래의 재정의된 모든 메서드를 호출하는 주체는 ListView이다.

//즉 ListView는 아래의 메서드를 통해 데이터 정보를 반영한다.

//리스트뷰에게 리스트의 개수를 몇개로 구성해야하는지를 알게해준다.(호출자:ListView)

public int getCount() {

return lst.size();

}

//리스트뷰에게 지정한 postion 변수에 해당하는 순서의 데이터를 추출할 수 있도록 해준다.

public Object getItem(int position) {

return null;

}

public long getItemId(int position) {

return 0;

}

//리스트뷰는 getView 메서드를 getCount()반환값 만큼 호출하여, 각 item을 구성하게 된다.

//이 예제의 경우 데이터가 13건이기 때문에 인플레이션 13번 일으켜 그 결과를 return해준다.

public View getView(int position, View convertView, ViewGroup parent) {

//getView메서드의 특징

//스마트폰에 아이템이 화면에 보여지는 시점에 화면구성을 위해 호출된다.

//따라서 내가 보여줄 데이터가 100건이라도 화면에 보여질 리스트의 개수가 13건이면

//getView호출은 12번을 먼저 호출한 후, 화면에 가려졌다가 다시 보이게 되는 아이템이 발생하면

//다시 getView가 발생한다.

//따라서 한 아이템당 한번만 인플레이션이 이루어지도록 조건문을 넣어줘야 한다.

View view=null;

if(convertView==null){

view = inflater.inflate(R.layout.fruit_item, parent, false);

}else{

view = convertView;

}

RelativeLayout layout = (RelativeLayout)view;

//레이아웃 객체는 자신이 포함하고 있는 위젯들을 id로 검색할수 있다.

TextView txt_title = (TextView)layout.findViewById(R.id.txt_title);

TextView txt_content = (TextView)layout.findViewById(R.id.txt_content);

txt_title.setText((String)lst.get(position));

txt_content.setText((String)lst.get(position)+"입니다.");

Log.i(this.getClass().getName(), "View의 주소값:"+view);

return layout;

}

}




- fruit_main.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="match_parent"

    android:orientation="vertical" >

    <ListView 

        android:id="@+id/lv"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"/>


</LinearLayout>

 



- fruit_item.xml

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent" >

    

    <ImageView 

        android:id="@+id/img_fruit"

        android:layout_width="50dp"

        android:layout_height="50dp"

        android:layout_alignParentLeft="true"

        android:src="@drawable/ic_launcher"/>

    

    <TextView 

        android:id="@+id/txt_title"

        android:layout_width="150dp"

        android:layout_height="wrap_content"

        android:text="수박"

        android:textSize="20dp"

        android:layout_centerHorizontal="true"/>

    

    <TextView 

        android:id="@+id/txt_content"

        android:layout_width="150dp"

        android:layout_height="wrap_content"

        android:text="수박입니다."

        android:textSize="20dp"

        android:layout_below="@id/txt_title"

        android:layout_centerHorizontal="true"/>

    

    <Button 

        android:id="@+id/btn_buy"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="선택"

        android:layout_alignParentRight="true"/>

        

</RelativeLayout>

 




















Posted by -현's-

댓글을 달아 주세요


리스트뷰(ListView)

- 여러개의 목록을 보여주는 위젯이다.


- 리스트뷰에 보여줄 데이터는 리스트뷰에 직접 입력하는 것이 아니라, adapter 객체에 담고, 그 adapter객체를 리스트뷰에 넣어줘야한다.


- adapter객체에 담을 데이터는 xml에서 불러올수도 있고 자바에서 넣어줄수도 있다.


ListView처럼 다량의 데이터를 처리하는 위젯은 어댑터라는 중간 객체에 의존하게 된다. 이유는 디자인에 불과한 ListView가 직접 데이터를 제어하게 되면, 유지보수성이 떨어지게 되기 때문이다.


- 안드로이드에서는 ListView처럼 다수의 데이터를 처리하는 위젯이 여러개 있다. 아래 4개 위젯 모두 데이터를 직접 제어하지 않고 어댑터 객체를 이용한다. 그래서 어댑터뷰라고 부른다.

(ListView,GridView, Spinner, Gallery(더 이상 사용x) )







●리스트뷰 예제1


- activity_main.xml

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

    tools:context="${relativePackage}.${activityClass}" >

    <ListView 

        android:id="@+id/lv"

        android:layout_width="match_parent"

        android:layout_height="wrap_content">

    </ListView>

    

</RelativeLayout>




- MainActivity.java

package com.example.day0314;


import java.util.ArrayList;


import android.app.Activity;

import android.os.Bundle;

import android.widget.ArrayAdapter;

import android.widget.ListView;


public class MainActivity extends Activity {


@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//xml로 존재하는 데이터를 ListView에 적용

ListView lv = (ListView)findViewById(R.id.lv);

//어댑터 선언

//adapter의 자식 객체이며, 데이터가 List계역일때 사용하기 좋음

//xml에서 데이터 가져오기

ArrayAdapter adapter1 = ArrayAdapter.createFromResource(this, R.array.number, android.R.layout.simple_list_item_1);

//자바코드내에서 List에 데이터를 담아 어댑터로 제어

ArrayList list = new ArrayList();

list.add("리스트1");

list.add("리스트2");

list.add("리스트3");

list.add("리스트4");

//android.R.layout.simple_list_item_1는 안드로이드에서 제공해주는 폼이다.

ArrayAdapter adapter2 = new ArrayAdapter(this, android.R.layout.simple_list_item_1, list);

//android.R.layout.simple_list_item_1 대신 개발자가 만든 xml을 사용해도 된다.

ArrayAdapter adapter3 = new ArrayAdapter(this, R.layout.my_list_item_1, list);

//리스트뷰에 어댑터 적용

//lv.setAdapter(adapter1);

//lv.setAdapter(adapter2);

lv.setAdapter(adapter3);

}

}

 



- my_list_item_1.xml

(사용자가 만들어준 ListView 양식이다. 안드로이드에서 제공해주는 양식을 사용해도 되고 사용자가 만들어서 사용해도 된다.)

<?xml version="1.0" encoding="utf-8"?>

<TextView

    xmlns:android="http://schemas.android.com/apk/res/android" 

    android:id="@+id/TextView1" 

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    android:textSize="30dp"

    android:textColor="#aec7e1"

    android:background="#cae682" /> 













Posted by -현's-

댓글을 달아 주세요