안드로이드 개발 질문/답변
(글 수 45,052)
package com.project.GCB;
import java.util.ArrayList;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.GridView;
import android.widget.ImageView;
public class SelectImage extends Activity{
private Context mContext = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.gridgallery);
ArrayList<BgImage> items = new ArrayList<BgImage>();
mContext = this;
GridView lvMain = (GridView)findViewById(R.id.gvGallery);
// 커스텀 ArrayAdapter 선언/초기화.
final MyArrayAdapter aa = new MyArrayAdapter(this, R.layout.row, items);
// 본 Activity의 아답터로 aa 지정.
lvMain.setAdapter(aa);
// 확인 버튼 클릭 이벤트 설정
Button btnView = (Button)findViewById(R.id.btnView);
btnView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
aa.callImageViewer();
}
});
Button btn = (Button)findViewById(R.id.btn_Right);
btn.setOnClickListener(new Button.OnClickListener(){
public void onClick(View v) {
Intent intent = new Intent(SelectImage.this, SelectImage2.class);
startActivity(intent);
}
});
}
// ArrayAdapter에서 상속받는 커스텀 ArrayAdapter 정의.
private class MyArrayAdapter extends ArrayAdapter<BgImage> {
private ArrayList<String> arrDataList;
private ArrayList<String> arrIdList;
private ArrayList<BgImage> items;
// 생성자
public MyArrayAdapter(Context context, int textViewResourceId, ArrayList<BgImage> items) {
super(context, textViewResourceId, items);
this.items = items;
mContext = context;
arrIdList = new ArrayList<String>();
arrDataList = new ArrayList<String>();
getArrayInfo(arrIdList,arrDataList);
}
// Image를 클릭 하였을 떄 Image를 크게 보기 위하여 Image의 정보를 호출
public final void callImageViewer() {
Intent i = getIntent();
ArrayList<String> arrBuf = new ArrayList<String>();
for (int j=0; j<arrDataList.size(); j++){
if (items.get(j).getCheck()) {
arrBuf.add(arrDataList.get(j));
}
}
i.putExtra("image", arrBuf);
setResult(RESULT_OK, i);
finish();
}
// ListView에서 각 행(row)을 화면에 표시하기 전 호출됨.
public View getView(final int position, View convertView, ViewGroup parent){
// LayoutInflater의 객체 inflater를 현재 context와 연결된 inflater로 초기화.
LayoutInflater inflater = ((Activity)mContext).getLayoutInflater();
// inflator객체를 이용하여 \res\laout\row.xml 파싱
View row = (View)inflater.inflate(R.layout.row, null);
// 체크박스 설정 변경 이벤트 설정
CheckBox chk = (CheckBox)row.findViewById(R.id.chkRow);
chk.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// 체크박스 설정 변경시 정보 저장
items.get(position).setCheck(!items.get(position).getCheck());
}
});
ImageView ivGrid;
ivGrid = (ImageView)row.findViewById(R.id.ivRow);
ivGrid.setScaleType(ImageView.ScaleType.FIT_CENTER);
BitmapFactory.Options bfOpt = new BitmapFactory.Options();
bfOpt.inSampleSize = 8;
Bitmap bmpImg = BitmapFactory.decodeFile(arrDataList.get(position), bfOpt);
Bitmap bmpRs = Bitmap.createScaledBitmap(bmpImg, 50, 50, true);
ivGrid.setImageBitmap(bmpRs);
// 도전
//ivGrid.setImageResource(arrDataList.size());
// 커스터마이징 된 View 리턴.
return row;
}
// 출력 갯수 지정하는 함수를 만들어 버리자~!
public int getCount(){
//return mThumbIds.length;
//return arrDataList.size();
return 4;
}
// 저장된 이미지를 불러와 arraylist에 넣기
private void getArrayInfo(ArrayList<String> arrID, ArrayList<String> arrData) {
String[] proj = {
MediaStore.Images.Media._ID,
MediaStore.Images.Media.DATA,
MediaStore.Images.Media.DISPLAY_NAME,
MediaStore.Images.Media.SIZE
};
Cursor curImage = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, proj, null, null, null);
if (curImage != null && curImage.moveToFirst()) {
String strData;
if (curImage.getCount() > 0) {
//int iDataCol = curImage.getColumnIndex(MediaStore.Images.Media.DATA);
}
int iDataCol = curImage.getColumnIndex(MediaStore.Images.Media.DATA);
//iDataCol = iDataCol -4;
do {
strData = curImage.getString(iDataCol);
if (strData != null) {
arrData.add(strData);
BgImage bg = new BgImage(false);
items.add(bg);
}
}while (curImage.moveToNext());
}
curImage.close();
}
}
}
class BgImage {
private boolean chkImg;
public BgImage (boolean _chkImg){
this.chkImg = _chkImg;
}
public void setCheck(boolean chk) {
chkImg = chk;
}
public boolean getCheck() {
return chkImg;
}
}
위와 같이 Sdcard의 이미지를 전부 불러오는 소스인데요
이미지가 총 12개 라고 가정하고 Activity를 3개씩 나누어 한 화면당 4장씩 나오게 했을 떄,
Activity가 넘어갈 시에 1 2 3 4 / 5 6 7 8 / 9 10 11 12 로 나오게 하려면 어떻게 해야 할까요?
보통 arrDataList.size()를 써버려서 전체 이미지만 가져오게 하더라고요.
하지만 그렇게 하면 2번째 Activity부터 5678을 구현하기 힘들더군요
이미지를 지정하는 방식이 아니라 sd카드에서 불어왔을 때 제가 출력하고 싶은 곳 부터 출력 하고 싶습니다...
지정하는 방법은 없을까요? 순서를 바꾸는 방법은 없을까요?



