GridView 스크롤 비활성화 개요
이 튜토리얼에서는 안드로이드 앱에서 GridView의 스크롤 기능을 비활성화하는 방법을 단계별로 살펴봅니다. GridView를 ScrollView나 다른 스크롤 가능한 레이아웃 내부에 배치할 때 중첩 스크롤 문제가 발생하곤 하는데, 이럴 때 GridView 자체의 스크롤을 막으면 유용합니다.
핵심 아이디어는 간단합니다. GridView에 OnTouchListener를 설정하고, 터치 이동(ACTION_MOVE) 이벤트가 발생했을 때 true를 반환하여 스크롤 동작을 가로채는 것입니다.
Step 1 — 새 프로젝트 생성
Android Studio에서 File ⇒ New Project를 선택하고, 새 프로젝트를 만드는 데 필요한 모든 세부 정보를 입력하여 프로젝트를 생성합니다.
Step 2 — 레이아웃 파일 작성 (res/layout/activity_main.xml)
아래 코드를 res/layout/activity_main.xml에 추가합니다.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="8dp"
tools:context=".MainActivity">
<GridView
android:id="@+id/gridLayout"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>레이아웃에는 화면 전체를 채우는 하나의 GridView만 포함되어 있습니다.
Step 3 — 메인 액티비티 코드 작성 (src/MainActivity.java)
아래 코드를 src/MainActivity.java에 추가합니다.
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
GridView gridView;
Integer[] imageIDs = {R.drawable.one, R.drawable.two, R.drawable.three,
R.drawable.four, R.drawable.five, R.drawable.six, R.drawable.seven,
R.drawable.eight, R.drawable.nine, R.drawable.ten};
@SuppressLint("ClickableViewAccessibility")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
gridView = findViewById(R.id.gridLayout);
gridView.setAdapter(new ImageAdapterGridView(this));
// 터치 이동 이벤트를 가로채서 스크롤 비활성화
gridView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Toast.makeText(MainActivity.this,
"Scrolling is Disabled", Toast.LENGTH_SHORT).show();
return event.getAction() == MotionEvent.ACTION_MOVE;
}
});
}
public class ImageAdapterGridView extends BaseAdapter {
private Context context;
ImageAdapterGridView(Context c) {
context = c;
}
public int getCount() {
return imageIDs.length;
}
public Object getItem(int position) {
return null;
}
public long getItemId(int position) {
return 0;
}
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if (convertView == null) {
imageView = new ImageView(context);
imageView.setLayoutParams(new
GridView.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.MATCH_PARENT));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setPadding(20, 20, 20, 20);
} else {
imageView = (ImageView) convertView;
}
imageView.setImageResource(imageIDs[position]);
return imageView;
}
}
}코드 핵심 포인트
setOnTouchListener()가 이 예제의 핵심입니다. 사용자가 손가락을 드래그하면 MotionEvent.ACTION_MOVE가 발생하고, 이때 리스너가 true를 반환하여 GridView가 해당 터치 이벤트를 소비하게 됩니다. 그 결과 GridView는 스크롤하지 않고, 대신 "Scrolling is Disabled"라는 토스트 메시지가 표시됩니다. 반면 단순 탭(클릭)은 여전히 정상적으로 처리되므로, 아이템 선택 기능은 유지됩니다.
어댑터(ImageAdapterGridView)는 10개의 이미지 리소스를 GridView에 표시하며, 뷰 재활용(View Recycling) 패턴을 사용해 성능을 최적화합니다.
Step 4 — 매니페스트 파일 작성 (androidManifest.xml)
아래 코드를 androidManifest.xml에 추가합니다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="app.com.sample">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>앱 실행 및 결과 확인
이제 애플리케이션을 실행해 보겠습니다. 실제 안드로이드 모바일 기기를 컴퓨터에 연결했다고 가정합니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤, 툴바에서 Run(실행) 아이콘을 클릭하세요. 실행 옵션으로 모바일 기기를 선택하면, 연결된 기기에 아래와 같은 기본 화면이 표시됩니다.

화면에서 GridView를 드래그해 보면 스크롤이 되지 않고 "Scrolling is Disabled" 토스트 메시지가 나타나는 것을 확인할 수 있습니다. 이처럼 간단한 터치 리스너 설정만으로 GridView의 스크롤을 손쉽게 제어할 수 있습니다.