Global It Leader!!



 
 

모바일 [안드로이드 개발 강좌] 리스트뷰(ListView) - BaseAdapter

페이지 정보

작성자 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 댓글 0건 조회 3,616회 작성일 14-08-31 19:32

본문

seAdapter를 이용한 리스트뷰를 만들어보겠습니다. 

일명 커스톰뷰(CustomView) 입니다.

 

우선 만들 리스트뷰의 결과물을 보겠습니다.

 

좌측에 이미지가 있으며, 가운데에는 이름, 전화번호, 이메일이 있으며, 우측에는 수정/삭제 버튼이 있습니다.

위와 같은 모습의 리스트뷰를 만들것입니다.

 

 

=============================================

Project Name : ListBaseAdapter

Package Name : kidsbear.listbaseadapter

android version : 2.2 (8)

java version : jdk 1.6

=============================================

 

1. 우선 화면에 보여줄 res > layout > main.xml 레이아웃 파일을 작성합니다.


  간단하게 상단에 TextView를 생성하고, 그 이외의 부분은 ListView로 가득 채웠습니다.

  실행 시 화면의 모습이며, 레이아웃의 모습은 아래와 같습니다.
 

 

 

 

2. 리스트로 보여 줄 레이아웃을 작성합니다.

   res > layout 폴더에 list_layout.xml 파일을 추가하여 다음과 같이 작성하여 줍니다.


 
  이 레이아웃 파일은 ListView를 구성하는 항목 하나를 나타내는 레이아웃입니다.

  즉 결과물에서 보여지는 ListView의 모습에서 아래의 그림과 같이 한 줄의 레이아웃을 작성하는 것입니다.
 

 

 

 

3. MyData.java 라는 클래스를 새로 생성하여 다음과 같이 작성합니다.

   한 줄당 포함하고있는 데이터가 여러개 이므로 이것을 데이터를 담는 Class로 작성하여 사용하도록 합니다.

   필요한 데이터는 이미지, 이름, 전화번호, 이메일주소 입니다.

   이를 모두 포함하고 있는 클래스를 만들도록 하겠습니다.

  

  데이터를 담을 변수 4개를 선언하였고,

  이를 세팅할 수 있는 생성자를 선언하였습니다.

  그리고 이들의 getter메소드를 작성하여 외부에서 사용할 수 있도록 하였습니다.

 

 

 

 

4. 이제 메인 액티비티를 작성해보도록 하겠습니다.

   OnCreate() 메소드가 시작하면 setData() 메소드를 통해 ArrayList에 화면에 보여줄 데이터를 세팅합니다.

  이후 MyAdapter라는 어댑터 객체를 생성합니다.

  이 때 Context(this)와 세팅한 데이터(ArrayList)를 참조변수로 보내줍니다.

  아직 작성전이므로 빨간줄이 보일것입니다.

  다음으로 main.xml에서 작성한 ListView를 참조하여 이를 어댑터와 연결하여 줍니다.

  액티비티에서 작업할 내용은 이것이 전부입니다.

  ListView는 연결된 Adapter를 참조하여 화면에 보여주는 것입니다.

  그럼 MyAdapter 클래스를 작성하여 보겠습니다.

 

 

 

 

5. BaseAdapter를 상속한 MyAdapter라는 클래스를 생성하여 다음과 같이 작성합니다.


 

  BaseAdapter는 추상클래스로써 이 클래스를 상속받으면 반드시 오버라이딩 해야 하는 메소드가 있습니다.

  getCount(), getItem(), getItemId(), getView() 메소드가 그것입니다.

  getCount() 메소드는 어댑터에 몇개의 데이터가 존재하는지 확인하는데 여기서는 ArrayList의 사이즈를 리턴했습니다.

  getItem() 메소드는 position 위치의 항목에 대해 확인하는데 여기서는 Name항목을 리턴했습니다.

  getItemId() 메소드는 위치를 확인하는데 position 그대로를 리턴했습니다.

 

  getView() 메소드.. 이것이 가장 중요합니다.

  여기에서 항목 하나를 출력하기 위한 뷰(View)를 생성하여 리턴하는 역할을 합니다.

  매개변수로 받는 첫번째인 position은 항목의 순서값이며,

  두번째인 convertView는 이전에 생성된 View입니다.  처음에는 생성된 View가 없기 때문에 null값입니다.

  따라서 null일때, 우리가 작성한 list_layout.xml 레이아웃을 인플레이트 해서 convertView에 넣어주는 것입니다.

  만약 리스트뷰를 처음 보여주는 화면에 5줄의 항목이 표시된다면 처음 5줄을 생성할 때에는 convertView가 모두 null값이며,

  위와같이 레이아웃을 인플레이트해서 생성해줍니다.

  이 후 ListView를 위나 아래로 스크롤 할때 사라지는 convertView는 반환되고 그것을 재사용하는 형태입니다.

  세번째인 parent는 생성되는 뷰의 부모, 여기서는 어댑터와 연결된 ListView가 그것입니다.

 

  그렇게 convertView의 객체가 생성되면 아래에서 각 뷰들의 항목을 참조하여 데이터를 세팅하며,

  버튼에는 클릭 이벤트를 설정합니다.

 

  그리고 그렇게 설정이 완료 된 convertView를 리턴하고 액티비티의 ListView는 이것을 화면에 보여주게 되는 것입니다.

package kidsbear.listbaseadapter;

import java.util.ArrayList;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class MyAdapter extends BaseAdapter {

 private Context context;
 private ArrayList<MyData> arrData;
 private LayoutInflater inflater;
 
 public MyAdapter(Context c, ArrayList<MyData> arr) {
  this.context = c;
  this.arrData = arr;
  inflater = (LayoutInflater)c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 }

 public int getCount() {
  return arrData.size();
 }

 public Object getItem(int position) {
  return arrData.get(position).getName();
 }

 public long getItemId(int position) {
  return position;
 }

 public View getView(int position, View convertView, ViewGroup parent) {

  if(convertView == null){
   convertView = inflater.inflate(R.layout.list_layout, parent, false);
  }
  
  ImageView image = (ImageView)convertView.findViewById(R.id.image);
  image.setImageResource(arrData.get(position).getImage());
  
  TextView name = (TextView)convertView.findViewById(R.id.name);
  name.setText(arrData.get(position).getName());
  
  TextView tel = (TextView)convertView.findViewById(R.id.tel);
  tel.setText(arrData.get(position).getTel());
  
  TextView email = (TextView)convertView.findViewById(R.id.email);
  email.setText(arrData.get(position).getEmail());
  
  Button modifyBtn = (Button)convertView.findViewById(R.id.modifybtn);
  modifyBtn.setOnClickListener(new OnClickListener() {   
   public void onClick(View v) {
    Toast.makeText(context, "수정합니다.", Toast.LENGTH_SHORT).show();
   }
  });
  
  Button delBtn = (Button)convertView.findViewById(R.id.delbtn);
  delBtn.setOnClickListener(new OnClickListener() {   
   public void onClick(View v) {
    Toast.makeText(context, "삭제합니다.", Toast.LENGTH_SHORT).show();
   }
  });
  
  return convertView;
 }


}

 

 

 

 

위와같이 BaseAdapter를 상속한 Adapter 클래스를 사용하면,

수많은 형식은 레이아웃들을 표현할 수 있습니다.

또한 어댑터와 데이터, 레이아웃이 각 각 분리되어 있어 유연성이 굉장히 좋습니다.

댓글목록

등록된 댓글이 없습니다.

전체 79
게시물 검색
모바일세상 목록
번호 제목 글쓴이 조회 날짜
59 모바일 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 2393 05-18
58 모바일 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 1979 05-14
57 모바일 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 1981 05-14
56 모바일 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 5597 05-14
55 모바일 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 2012 05-07
54 모바일 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 2261 04-20
53 모바일 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 2403 03-31
52 모바일 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 2209 03-31
51 모바일 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 2299 09-01
50 모바일 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 2706 09-01
49 모바일 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 1860 09-01
48 모바일 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 1969 09-01
47 모바일 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 2492 09-01
46 제이쿼리 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 1985 09-01
45 모바일 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 2146 08-31
44 모바일 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 2015 08-31
열람중 모바일 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 3617 08-31
42 모바일 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 2166 08-30
41 모바일 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 1988 08-30
40 모바일 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 3259 08-29