AdapterView

홍성채·2022년 4월 18일
0

Android

목록 보기
15/27



  • ContactActivity

    package com.example.ex0414;
    
    import   androidx.appcompat.app.AppCompatActivity;
    
    import android.os.Bundle;
    import android.widget.ListView;
    
    import java.util.ArrayList;
    
    public class ContactActivity extends AppCompatActivity {
        ListView lvContact;
        ContactAdapter adapter;
        ArrayList<ContactVO> list;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_contact);
    
            lvContact = findViewById(R.id.lvContact);
             list = new ArrayList<ContactVO>();
    
            for(int i =0; i<20; i++){
                list.add(new ContactVO(R.drawable.ic_launcher_background,
                    "스인개"+(i+1),"010-1234-123"+i ));
            }
    
            adapter = new ContactAdapter(
                ContactActivity.this,
                R.layout.list_item,
                list);
            lvContact.setAdapter(adapter);
    
        }
    }
    • 코드 해석
         list = new ArrayList<ContactVO>();
      사용자가 원하는 데이터 형식과 타입을 담기위해 ArrayList를 선언하고 들어갈 데이터들을 저장시킨 VO를 형식으로 담는다.
              list.add(new ContactVO(R.drawable.ic_launcher_background,
                  "스인개"+(i+1),"010-1234-123"+i ));
          }
      반복문을 이용하여 선언한 ArrayList에 추가한다.
       adapter = new ContactAdapter(
             ContactActivity.this,
             R.layout.list_item,
             list);
         lvContact.setAdapter(adapter);
      선언한 ContactAdapter를 연결한다(표시할 Activity,커스텀한 layout,데이터)
      listview에 어뎁터를 연결한다.
  • 어뎁터의 역할

    1. 리스트 뷰에 보여질 아이템 뷰를 생성해주는 역할
    2. 아이템 뷰와 데이터를 묶어서 View 객체로 생성
  • ContactAdapter.class

    package com.example.ex0414;
    
    import android.app.LauncherActivity;
    import android.content.Context;
    import android.content.Intent;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.Button;
    import android.widget.ImageButton;
    import android.widget.ImageView;
    import android.widget.TextView;
    import android.widget.Toast;
    import java.util.ArrayList;
    
    public class ContactAdapter extends BaseAdapter {
        Context context;
        //R.~~~ 는 정수형으로 변환시켜준다고 생각하면 된다.
        int layout;
        //여러형태의 데이터를 담기때문에
        ArrayList<ContactVO> list;
    
        //xml 파일 -> View 객체로 변환해주는 객체, 중요
        LayoutInflater inflater;
    
        public ContactAdapter(Context context, int layout, ArrayList<ContactVO> list) {
            this.context = context;
            this.layout = layout;
            this.list = list;
            this.inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }
    
        @Override
        public int getCount() {
            return list.size();
        }
    
        @Override
        //선택한 인덱스의 내용물?
        public Object getItem(int i) {
            return list.get(i);
        }
    
        @Override
        //선택한 인덱스를 반환하는 부분
        public long getItemId(int i) {
            return i;
        }
    
        @Override
        //직접적으로 구현해야되는 부분
        // i는 인덱스 역할, view는 layout에 대한 정보를 보관해줄 객체, ViewGroup은 리스트 뷰 어뎁터
        public View getView(int i, View view, ViewGroup viewGroup) {
            //아이템 뷰에 배치된 View객체들을 한 번 초기화
            ViewHolder holder = null;
    
            // list_item.xml -> View 객체로 변환
            if(view ==null){
                view = inflater.inflate(layout, viewGroup, false);
                holder = new ViewHolder(view);
    
                //초기화된 holder 객체를 view객체에 태그로 저장,setTag는 저장시키는 것
                view.setTag(holder);
            }else{
                //view객체에 저장된 holder객체를 가져와서 저장장
               holder = (ViewHolder) view.getTag();
            }
    
            //list_item.xml 안에 있는 ImageView, Textview, Button 초기화
    //        ImageView imageView = view.findViewById(R.id.imageView2);
    //        ImageButton btnCall = view.findViewById(R.id.call);
    //        TextView tvName = view.findViewById(R.id.name);
    //        TextView tvPhone = view.findViewById(R.id.phone);
            //생성한 View 객체를 활용
    //        ContactVO vo = (ContactVO) getItem(i);
    //        imageView.setImageResource(vo.getImg());
    //        tvName.setText(vo.getName());
    //        tvPhone.setText(vo.getPhone());
    
            ContactVO vo = (ContactVO) getItem(i);
            holder.getImageView().setImageResource(vo.getImg());
            holder.getTvName().setText(vo.getName());
            holder.getTvPhone().setText(vo.getPhone());
    
            holder.getBtnCall().setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view)     {
                    //context = ContactActivity를 가리킴
                    Toast.makeText(context,vo.getPhone(),Toast.LENGTH_SHORT).show();
                    Intent intent = new Intent(context,MainActivity.class);
                    //ContactAdapter는 액티비티가 아닌 일반클래스이기 때문에
                    //액티비티에서만 사용할 수 있는 메소드를 바로 호출이 불가능
                    // 사용하려면 액티비티 정보를 가진 Context 객체를 통해서 사용가능!
                    context.startActivity(intent);
    
                }
            });
    
                //생성된 Layout View객체를 리턴 -> listView에 출력
            return view; //젤 중요
          }
     }
    • 코드 해석

        Context context;
        int layout;
        ArrayList<ContactVO> list;
      
        LayoutInflater inflater;
      
        public ContactAdapter(Context context, int layout, ArrayList<ContactVO> list) {
            this.context = context;
            this.layout = layout;
            this.list = list;
            this.inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
      }

      매개변수로 받아온 데이터들을 ConcactAdapter 초기화 시킨다.

      @Override
      public int getCount() {
          return list.size();
      }
      
      @Override
        public Object getItem(int i) {
          return list.get(i);
      }
      
      @Override
       public long getItemId(int i) {
          return i;
      }

      해당 부분들을 반환시킨다.( 크기, 해당 인덱스의 데이터, 인덱스 아이디값)

        @Override
        
        public View getView(int i, View view, ViewGroup viewGroup) {
            //아이템 뷰에 배치된 View객체들을 한 번 초기화
            ViewHolder holder = null;
      
            // list_item.xml -> View 객체로 변환
            if(view ==null){
                view = inflater.inflate(layout, viewGroup, false);
                holder = new ViewHolder(view);
      
                //초기화된 holder 객체를 view객체에 태그로 저장,setTag는 저장시키는 것
                view.setTag(holder);
            }else{
                //view객체에 저장된 holder객체를 가져와서 저장장
               holder = (ViewHolder) view.getTag();
            }
      
            //list_item.xml 안에 있는 ImageView, Textview, Button 초기화
      //        ImageView imageView = view.findViewById(R.id.imageView2);
      //        ImageButton btnCall = view.findViewById(R.id.call);
      //        TextView tvName = view.findViewById(R.id.name);
      //        TextView tvPhone = view.findViewById(R.id.phone);
            //생성한 View 객체를 활용
      //        ContactVO vo = (ContactVO) getItem(i);
      //        imageView.setImageResource(vo.getImg());
      //        tvName.setText(vo.getName());
      //        tvPhone.setText(vo.getPhone());
      
            ContactVO vo = (ContactVO) getItem(i);
            holder.getImageView().setImageResource(vo.getImg());
            holder.getTvName().setText(vo.getName());
            holder.getTvPhone().setText(vo.getPhone());
      
            holder.getBtnCall().setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view)     {
                    //context = ContactActivity를 가리킴
                    Toast.makeText(context,vo.getPhone(),Toast.LENGTH_SHORT).show();
                    Intent intent = new Intent(context,MainActivity.class);
                    //ContactAdapter는 액티비티가 아닌 일반클래스이기 때문에
                    //액티비티에서만 사용할 수 있는 메소드를 바로 호출이 불가능
                    // 사용하려면 액티비티 정보를 가진 Context 객체를 통해서 사용가능!
                    context.startActivity(intent);
      
                }
            });
      
                //생성된 Layout View객체를 리턴 -> listView에 출력
            return view; //젤 중요
          }
      }

      직접적으로 구현해야되는 부분
      i는 인덱스 역할, view는 layout에 대한 정보를 보관해줄 객체, ViewGroup은 리스트 뷰 어뎁터

  • ConcactVO.class

    ```
    package com.example.ex0414;
    
    public class ContactVO {
    private int img;
    private String name;
    private String phone;
    
    public ContactVO(){}
    
    public ContactVO(int img, String name, String phone) {
        this.img = img;
        this.name = name;
        this.phone = phone;
    }
    
    public int getImg() {
        return img;
    }
    
    public void setImg(int img) {
        this.img = img;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public String getPhone() {
        return phone;
    }
    
    public void setPhone(String phone) {
        this.phone = phone;
    }
    
    @Override
    public String toString() {
        return "ContactVO{" +
                "img=" + img +
                ", name='" + name + '\'' +
                ", phone='" + phone + '\'' +
                '}';
     }

    }
    ListView에 넣을 데이터들을 초기화하거나 값을 불러올 때 사용한다.

  • Viewholder

    package com.example.ex0414;
    
    import android.view.View;
    import android.widget.ImageButton;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    //아이탬뷰에 배치된
    public class ViewHolder {
      private ImageView imageView;
      private TextView tvName;
      private TextView tvPhone;
      private ImageButton btnCall;
    
      public ViewHolder(View itemView){
          imageView = itemView.findViewById(R.id.imageView2);
          btnCall = itemView.findViewById(R.id.call);
          tvName = itemView.findViewById(R.id.name);
          tvPhone = itemView.findViewById(R.id.phone);
      }
    
      public ImageView getImageView() {
          return imageView;
      }
    
      public TextView getTvName() {
          return tvName;
      } 
    
      public TextView getTvPhone() {
          return tvPhone;
      }
    
      public ImageButton getBtnCall() {
          return btnCall;
      }
    }

    커스텀 ListView의 각 속성값들을 초기화하고 해당 부분들을 반환한다.

profile
초보 코딩

0개의 댓글