마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

그리드 뷰 내의 이미지 객체 클릭시 새 액티비티로 클릭한 이미지 전달하는 방법

0 추천

현재 삽질을 하면서 간단하게 안드로이드 프로젝트를 하나 해보고 있습니다. 간단한 쇼핑몰 앱의 느낌인데요. 원래 구상대로라면 데이터베이스를 통해 검색 결과를 가져와야 하지만 아직은 거기까지는 공부가 되지 않아서 일단은 배열에 이미지 파일들을 넣어놓고 값을 그리드 뷰에 이미지 뷰 형태로 반환한 상태입니다.

public class ImageAdapter extends BaseAdapter {

    private Context context;

    private Integer[] img = new Integer[] {
            R.drawable.a, R.drawable.b, R.drawable.c,
            R.drawable.d, R.drawable.e, R.drawable.f,
            R.drawable.g, R.drawable.h, R.drawable.i,
            R.drawable.j
    };

    public ImageAdapter(Context context) {
        //context를 화면에 출력하기 위한 메서드
        this.context = context;
    }

    public int getCount() {
        //표현할 아이템 수 설정 메서드
        return (null != img) ? img.length : 0;
        //return img.length; //img 배열 내의 원소 전부 출력
    }

    public Integer getItem(int position) {
        //원하는 위치의 아이템 반환
        return (null != img) ? img[position] : 0;
    }

    public long getItemId(int position) {
        //아이템의 id 설정해주는 메서드(위에서 이미 배열로 설정했다면 필요 없음)
        Exception e = new Exception();
        return 0;
    }

    public View getView(int position, View view, ViewGroup viewGroup) {
        //실제 아이템을 화면에 배치시 호출되는 메서드
        ImageView imageView = null;

        if(view == null) {
            imageView = new ImageView(context);
        }

        else {
            imageView = (ImageView) view;
        }

        //이미지 크기 조절
        imageView.setLayoutParams(new ViewGroup.LayoutParams(400, 400));
        //이미지 출력 형식 지정
        imageView.setScaleType(ImageView.ScaleType.FIT_XY);

        //이미지 뷰 간 간격 조절
        imageView.setPadding(10, 10, 10, 10);

        imageView.setImageResource(img[position]);

        return imageView;
    }
}

일단 어댑터는 이런 식으로 만들었고, 액티비티에서 그리드 뷰를 이용해 이 어댑터를 화면에 표시하는 상황입니다. 이때 그리드뷰의 아이템(?)을 클릭 할 경우 클릭 이벤트로 다음 액티비티로 이동하는 것 까지는 구현을 하였습니다. 

gv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(FirstscreenActivity.this, "result "+position, Toast.LENGTH_SHORT).show();

                Intent todetail = new Intent(getApplicationContext(), ThirdscreenActivity.class);
                Bitmap sendBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a); //R.drawable.god 대신 클릭된 그리드 뷰 이미지에 대한 값이 들어가야 함
                ByteArrayOutputStream stream = new ByteArrayOutputStream();
                sendBitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
                byte[] byteArray = stream.toByteArray();
                todetail.putExtra("image",byteArray);
                startActivity(todetail);
            }
        });

그리드 뷰에 대한 클릭 이벤트입니다. 이미지를 저런 식으로 값을 받을 액티비티에 넘겨주려고 했는데, 저 부분(R.drawable.a)에 어떤 값을 넣어줘야 클릭한 이미지의 값이 전달되는지 몰라서 헤매고 있습니다. 그래서 일단은 하나의 이미지만 고정적으로 보여지도록 만들어놓기만 한 상태입니다. 제가 한 방식이 맞다면 어디를 고쳐야 하는지, 틀렸다면 어떻게 새로 고쳐져야 하는지 알려주시면 정말 감사하겠습니다.(_0_)

긴 글 읽어주셔서 감사합니다.

블루는파랑 (160 포인트) 님이 2021년 2월 8일 질문

1개의 답변

+1 추천

ListItemClickListener의 onItemClick에서 선택한 아이템의 포지션을 구하실 수 있고, ImageAdapter에서는 getItem()메소드를 제공하므로 아래처럼 해보세요.

public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    [...]
    int imageResId = imageAdapter.getItem(position);
    Bitmap sendBitmap = BitmapFactory.decodeResource(getResources(), imageResId); 
    [...]
 }

 

 

spark (226,420 포인트) 님이 2021년 2월 9일 답변
감사합니다. 위 방법으로 수정했더니 바로 적용되네요
...