본문 바로가기

프로그래밍/안드로이드

[안드로이드] 어댑터 뷰(Adapter View)

어댑터뷰(Adapter View)


리스트뷰, 그리드뷰, 스피너, 갤러리 등은 항목 집합을 표시하는데 이들을 묶어서 어댑터뷰라고 한다.


1. 스피너(Spinner)



흔히 '콤보 박스(Combo Box)'라고 부르는 것이다.


먼저 values - arrays.xml 소스에


<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="genre">
<item>문학</item>
<item>인문/역사</item>
<item>예술/종교</item>
<item>사회/과학</item>
<item>경제/경영</item>
<item>자기계발</item>
<item>여행/잡지</item>
<item>어린이</item>
<item>영화</item>
<item>여성</item>
<item>원서</item>
</string-array>
</resources>

위에처럼 추가해준다.


public class ExerciseExam extends AppCompatActivity {
ArrayAdapter<CharSequence> adspin;
boolean mInitSpinner;
public void onCreate(Bundle savedINstanceState){
super.onCreate(savedINstanceState);
setContentView(R.layout.activity_excercise_exam);

Spinner spin = (Spinner)findViewById(R.id.myspinner);
spin.setPrompt("장르를 고르셈!.");

adspin = ArrayAdapter.createFromResource(this, R.array.genre, android.R.layout.simple_spinner_item);
adspin.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spin.setAdapter(adspin);

spin.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent, View view, int position, long id){
/*초기화 시의 선택 제외시 */
if (mInitSpinner ==false){
mInitSpinner = true;
return;
}

Toast.makeText(ExerciseExam.this, adspin.getItem(position) +
" 선택했음!.", Toast.LENGTH_SHORT).show();
}
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
}


2. 그리드 뷰(Grid View)


그리드뷰는 항목을 2차원의 표 형태로 출력하는 위젯이다.

<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/grid"
android:layout_width="match_parent"
android:layout_height="match_parent" //
android:padding="2dip"
android:verticalSpacing="4dip"       // verticalSpacing : 항목간 수직 간격

android:horizontalSpacing="4dip"     // horizontalSpacing : 항목간 수평 간격

android:numColumns="auto_fit" // numColumns : 열의 폭과 화면 폭을 자동으로 계산
android:columnWidth="72dip"          // columnWidth : 항목 하나당 폭

android:stretchMode="columnWidth"    // strechMode : 열 내부 여백이 있을시 처리 방법

// columnWidth일시 폭에 맞게 가득 채운다.

android:gravity="center"
/>

// 열(세로)의 개수를 지정하는 속성은 있지만

// 행(가로)의 개수를 지정하는 속성은 없다. 공급되는 데이터의 개수에 따라 행수가 자동으로 결정


public class GridViewTest extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.gridviewtest);

GridView grid = (GridView)findViewById(R.id.grid);
ImageAdapter Adapter = new ImageAdapter(this);
grid.setAdapter(Adapter);

grid.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(GridViewTest.this, position + "번째 그림 선택",
Toast.LENGTH_SHORT).show();
}
});
}
}

class ImageAdapter extends BaseAdapter {        // BaseAdapter로부터 파생

private Context mContext;

int[] picture = {
R.drawable.ccdam,
R.drawable.soyang2,
R.drawable.ududong,
R.drawable.zipdarigol,
R.drawable.dongul
};

public ImageAdapter(Context c) {
mContext = c;
}

public int getCount() {                      // getCount : 개수를 100개로 리턴

return 100;
}

public Object getItem(int position) {        // 이미지 5개를 돌려가면서 출력

return picture[position % 5];
}

public long getItemId(int position) {
return position;
}

public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if (convertView == null) {
imageView = new ImageView(mContext);
imageView.setLayoutParams(new GridView.LayoutParams(80, 60)); // 크기 80x60으로 설정
imageView.setAdjustViewBounds(false);
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
} else {
imageView = (ImageView) convertView;
}

imageView.setImageResource(picture[position % 5]);

return imageView;
}
}


3. 갤러리(Gallery)


갤러리는 중앙이 고정되어 있고 수평으로 스크롤되는 어댑터뷰이다.

위에 사진처럼 카카오톡에도 갤러리 형식으로 되어 있는 걸 확인할 수 있다.


현재는 수평스크롤뷰(Horizontal Scroll View)와 ViewPager 등의 더 좋은 위젯으로 대체되어 있다.

앞으로는 많이 사용되지 않는다고 한다.

public class GalleryTest extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.gallerytest);

@SuppressWarnings("deprecation")
Gallery gal = (Gallery) findViewById(R.id.gallery);
gal.setAdapter(new ImageAdapter2(this));
gal.setOnItemSelectedListener(new OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
Toast.makeText(GalleryTest.this, position +
"번째 그림 선택", Toast.LENGTH_SHORT).show();
}
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
}

class ImageAdapter2 extends BaseAdapter {
private Context mContext;
private int[] mImageIds = {
R.drawable.ccdam,
R.drawable.soyang2,
R.drawable.ududong,
R.drawable.zipdarigol,
R.drawable.dongul,
R.drawable.lotteworld,
};

public ImageAdapter2(Context c) {
mContext = c;
}

public int getCount() {
return mImageIds.length;
}

public Object getItem(int position) {
return mImageIds[position];
}

public long getItemId(int position) {
return position;
}

@SuppressWarnings("deprecation")
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;

if (convertView == null) {
imageView = new ImageView(mContext);
} else {
imageView = (ImageView)convertView;
}

imageView.setImageResource(mImageIds[position]);
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
imageView.setLayoutParams(new Gallery.LayoutParams(136, 88));

return imageView;
}
}