2009년 4월 6일 월요일

Customized list adapter 만들기

Android 에서 List 를 사용하기 위해서는 ListActivity를 상속받은후 list adapter 를 설정한 후setListAdapter() method 를 이용하여 사용할 수 있다.

Android 에서 기본적으로 제공하고 있는 Adapter는 SimpleAdapter, SimpleCursorAdapter
등과 같이 여러가지가 존재하지만, 만들고자 하는 Application 에 맞도록 List item 모양을 변경해야 할 필요가 있다. 이때 BaseAdapter  class를 이용하여 원하는 모양의 List 를 생성할 수 있다.

이전 File Browser 를 만들때 사용한 list adapter code를 예를 들 수 있다.

[ Adapter 생성하기 ]
---------------------------------------------------------------
public static class FileBrowserAdapter extends BaseAdapter {
     private LayoutInflater mAdapterInflater;
     private List mAdapterList;
    
        // 생성자 (필요에 따라 parameter를 설정할 수 있다.)        
        public FileBrowserAdapter(Context context, List list) {
         mAdapterInflater = LayoutInflater.from(context);
         mAdapterList = list;
        }

        // List count 를 얻기위한 Method 구현
        public int getCount() {
            return mAdapterList.size();
        }

        // List item 을 얻기위한 Method 구현
        public Object getItem(int position) {
         FileItem item = (FileItem)mAdapterList.get(position);
            return item;
        }

        // List item의 id 를 얻기위한 Method 구현
        public long getItemId(int position) {
         FileItem item = (FileItem)mAdapterList.get(position);
         return item.getId();
        }

        // 화면에 보여지는 List item 의 모양을 setting 하는 Method 구현
        public View getView(int position, View convertView, ViewGroup parent) {
         ViewHolder holder;
        
         if (convertView == null) {
                // List 한개의 item 모양을 정의한 xml을 설정한다. 
                convertView = mAdapterInflater.inflate(R.layout.filebrowser_list, null);
          
                // xml 에 포함된 widget의 instance를 얻는다.      
                holder = new ViewHolder();
                holder.img = (ImageView)convertView.findViewById(R.id.filebrowser_list_img);
                holder.foldername = (TextView)convertView.findViewById(R.id.filebrowser_list_txt_foldername);
                holder.filename = (CheckedTextView)convertView.findViewById(R.id.filebrowser_list_ck_txt_filename);
            } else {
             holder = (ViewHolder) convertView.getTag();
            }        

           FileItem item = (FileItem)mAdapterList.get(position);
        
                // xml widget의 속성및 값을 설정한다.
     if(item.getIsDir() == true)
     {
     holder.img.setImageResource(R.drawable.folder1);
     // folder visible
     holder.foldername.setVisibility(View.VISIBLE);
     holder.foldername.setText(item.getName());
     // file invisible
     holder.filename.setVisibility(View.INVISIBLE);
     holder.filename.setText("");
     }
     else
     {
     holder.img.setImageResource(R.drawable.file);
     // folder invisible
     holder.foldername.setVisibility(View.INVISIBLE);
     holder.foldername.setText("");
     // file visible
     holder.filename.setVisibility(View.VISIBLE);
     holder.filename.setText(item.getName());
     }                
            convertView.setTag(holder);
        
         return convertView;
        }

        // xml 의 widget 들에 대한 instance를 얻기위한 view holder
     static class ViewHolder {
     ImageView img;
     TextView foldername;
     CheckedTextView filename;
   }
    }
---------------------------------------------------------------

[ xml  작성하기 ]


[ 생성된 List  모습 ]