CH11 어댑터뷰 (Context 포함)

jiyoon·2023년 4월 3일
1

모바일 안드로이드

목록 보기
7/12

Adapter

(광의) 관계가 없는 인터페이스들이 같이 일할 수 있도록 도와주는 디자인 패턴
(협의) 데이터를 어댑터뷰에 공급해주는 클래스

  • ListView, ExpandableListView, GridView, Spinner, Gallery 등의 (선택) 어댑터뷰에 사용
  • 어댑터뷰를 사용할 때 어댑터뷰의 모양을 설정하고 데이터를 채워주는 타입별 어댑터 클래스를 함께 사용 (ex. ArrayAdapter, SimpleCursorAdapter 등)
    • cursor : 레코드 셋을 순화하는데 쓰는 클래스 (주소를 관리)_DB
  • 대화창 목록, 캘린더, 음악 목록(격자), 앨범목록(자유로운 격자), 전화앱, 카톡, 인스타그램, 스타벅스, 카톡 안의 채팅방 등

FAB(Floating Action Button) : plus 버튼 어디서나 접근 가능한 버튼

리스트뷰

데이터를 목록 형태로 보여주고 하나를 선택하는 용도로 사용

XML을 이용한 리스트뷰 만들기

리스트뷰 기본 형식

  1. 리스트뷰에 출력할 데이터를 String 배열로 정의
  2. 데이터와 형식을 정의하여 어댑터 객체 생성
new ArrayAdapter<String>(Context context, int resource, T[] objects);
//resource = Format = android.R.layout_simple_list_item_1
//T[] objects = Data
  1. 리스트뷰에 어댑터 설정
list.setAdapter(adapter);
//list = Format
  1. 리스트뷰 항목의 클릭 이벤트 처리
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
  @Override
	public void onItemClick(AdapterView<?> parent, View view, int position, long id) {}
});
//view : 항목별 뷰, position : 순서, long id : DB의 필드명

리스트 뷰의 동적 추가•삭제 예제

리스트 뷰의 항목을 동적으로 추가•삭제 하려면 ArrayList<T>를 정의한 후 add()remove() 메소드를 사용
변경사항을 업데이트하기 위해 Adapter.notifyDataSetChanged() 사용

어댑터 생성시 적용하는 resource

안드로이드가 미리 만들어 제공하는 레이아웃의 id로서 뷰에 따라 다음 레이아웃들을 적용

Ex11_01

Ex11_04

package ojy.mjc.ex11_04;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.Adapter;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    int index; //전역변수 설정 해서 변수 같이 씀.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final EditText editText = findViewById(R.id.edtItem);
        Button btnAdd = findViewById(R.id.btnAdd);
        ListView listView = findViewById(R.id.listView1);


        final ArrayList<String> midList = new ArrayList<>();

        final ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, midList);
        listView.setAdapter(adapter);

        btnAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                midList.add(editText.getText().toString());
                adapter.notifyDataSetChanged();
            }
        });

        AlertDialog.Builder dlg = new AlertDialog.Builder(MainActivity.this);
        dlg.setTitle("삭제여부 확인하실게요");
        dlg.setMessage("삭제하시겠습니까?");

        listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {

                index = position;

                return false;
            }
        });
        //LongClick 리스너의 후속 리스너 -> ClisckListener 로 자동 호출되기 때문에 전역변수 index로 값을 넘겨줌.

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                dlg.setPositiveButton("확인", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Toast.makeText(getApplicationContext(), "확인을 눌렀음", Toast.LENGTH_SHORT).show();
                        midList.remove(index);
                        adapter.notifyDataSetChanged();
                    }
                });
                dlg.show();
            }
        });
    }
}


그리드 뷰

사진이나 그림을 격자 모양으로 배치
xml 파일에는 간단히 <GridView>를 넣으면 되지만, Java 코드에는 필요한 내용을 반드시 코딩하여 항목을 동적 생성해야 한다.
<GridView>의 속성 중 열 개수를 지정하는 numColumns는 필수 지정!


어댑터 구현

개발자가 어댑터뷰의 항목들을 직접 설계하여 구현할 때에는 (커스터마이징) BaseAdapter 클래스를 상속받아 직접 어댑터 클래스를 작성해 개발한다.
화면에 출력되는 뷰를 구현하는 필수 메소드들을 오버라이딩한다.

Project11_1

갤러리

Context

poster_ID는 static형 변수로 만들어 주고, MainActivity.this는 context로 바꿔주면서 오류를 해결했다.

profile
주니어 개발자

0개의 댓글