본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[Android/안드로이드] ListView ( 리스트 뷰 ) 두번째 이야기.

by 돼지왕 왕돼지 2012. 2. 22.
반응형


안녕하세요 돼지왕 왕돼지입니다.
지난 시간에 이어 오늘은 ListView 의 두번째 이야기를 해볼까합니다.

첫번쨰 이야기에서 ListVIew 의 기본에 대해 다루었다면, 오늘은 Custom 한 측면과 변형된 측면에 focus 가 맞춰져 있습니다.

2012/02/22 - [프로그래밍 놀이터/안드로이드] - [Android/안드로이드] ListView ( 리스트 뷰 ) 첫번째 이야기. 
 
 

Custom Adapter ListView


<example>

MyListAdapter MyAdapter = new MyListAdapter(this, R.layout.custom, arraylist);
ListView MyList = (ListView)findViewById(R.id.list);
MyList.setAdapter(MyAdapter);
 
class MyListAdapter extends BaseAdapter{
   Context con;
   LayoutInflater inflater;
   ArrayList<MyItem> arraySrc;
   int layout;
 
   public MyListAdapter(Context context, int alayout, ArrayList<MyItem> aarraySrc){
      con = context;
      inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
      arraySrc = aarraySrc;
      layout = alayout;
   }
 
   public int getCount(){
      return arraySrc.size();
   }
 
   public String getItem(int position){
      return arraySrc.get(position).Name;
   }
 
   public long getItemId(int position){
      return position;
   }
 
   public View getView(int position, View convertView, ViewGroup parent){
      final int pos = position;
      if (convertView == null){
         convertView = inflater.inflate(layout, parent, false);
      }
 
      // array 내용을 layout의 어떤 항목들과 매치시킬지 설정해줌
      // ex) imageview 에 그림, textview에 글자 등..
      TextView txt = (TextView)convertView.findViewById(R.id.text);
      txt.setText(arraySrc.get(position).Name);
 
      return convertView;
   }
}


 




<중요 API>

View getView(int position, View convertView, ViewGroup parent)
 : 리스트 뷰가 각 항목을 출력할 때마다 어댑터의 getView() 호출하여 뷰 요청. parent는 생성되는 뷰의 부모, 즉 리스트 뷰. convertView는 이전에 생성된 차일드 뷰로  최초 호출시에는 null이 전달되기 때문에 커스텀 뷰를 새로 생성하여 리턴해야 한다.

 
  
 

여러 Item Layout 을 가지는 Custom Adapter List View

     : List Item 이 모두 똑같이 생기지 않고, 경우에 따라 item의 layout이 바뀌는 녀석.

<example>

class MultiAdapter extends BaseAdapter{
   LayoutInflater  mInflater;
   ArrayList<ListItem> arSrc;
 
   public MultiAdapter(Context context, ArrayList<ListItem> aritem){
      mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
      arSrc = arItem;
   }
 
   public in getCount() { /* To Do */ }
   public ListItem getItem(int position) { /* To Do */}
   public long getItemId(int position { return position; }
 
   // getView가 생성하는 뷰의 개수 리턴. 항상 같은 뷰이면 1.
   // 갯수를 제대로 조사해주지 않으면 다운 될 수 있다.
   public int getViewTypeCount(){ return 2; }
 
   public View getView(int position, View convertView, ViewGroup parent){
      if (convertView == null){
         int res = 0;
         switch (arSrc.get(position).Type){
         case 0:
            res = R.layout.textedit;
            break;
         case 1:
            res = R.layout.btnicon;
            break;
         }
         convertView = mInflater.inflate(res, parent, false);
      }
 
      switch (arSrc.get(position).Type){
         case 0:
            // To Do (mapping)
         case 1:
            // To Do (mapping)
      }
      return convertView;
   }
}

 


 
 

List Activity ( 리스트 액티비티 )

  : 시스템 차원에서 리스트 뷰만으로 액티비티를 구성하는 class. ListView를 내부 멤버로 가지며, 액티비티 전체를 리스트 뷰가 가득 채우도록 되어 있다. (별도의 layout이 필요하지 않다.)


<APIs>

ListView getListView();
void setListAdapter (ListAdapter adapter)
void onListItemClick (ListView I, View vm, int positionm, long id)



<example>

public class ListOnly extends ListActivity{
   protected void onCreate(Bundle savedInstanceState){
      super.onCreate(savedInstanceState);
      ...
      ArrayAdapter<String> Adapter = new ArrayAdapter<String>(this, ~, ~);
      setListAdapter(Adapter);
      // setContentView() 의 역할까지 해준다.
   }
 
   public void onListItemClick(ListView list, View view, int positionm, long id){
      // To Do
   }
} 

 


로그인 없이 추천 가능합니다. 손가락 꾸욱~





반응형

댓글