[13-2-D2][UI 설계] ListView, Adapter

[01] ListView

1. 간단한 형태의 ListView

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<ListView
 android:id="@+id/list" 
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
 />
</LinearLayout>

 

 

package exam.Widget;

import java.util.*;

import android.app.*;
import android.os.*;
import android.widget.*;
import exam.AndroidExam.*;

public class ListTest extends Activity {
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.widget_listtest);

  //* 데이터 원본 준비
  ArrayList<String> arGeneral = new ArrayList<String>();
  arGeneral.add("김유신");
  arGeneral.add("이순신");
  arGeneral.add("강감찬");
  arGeneral.add("을지문덕");
  //*/
  
  /* 배열로 준비
  String[] arGeneral = {"김유신", "이순신", "강감찬", "을지문덕"};
  //*/

  // 어댑터 준비
  ArrayAdapter<String> Adapter;
  Adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, arGeneral);

  // 어댑터 연결
  ListView list = (ListView)findViewById(R.id.list);
  list.setAdapter(Adapter);
 }
}

 

 

2. Android SDK Source

 

 


3. 고정된 배열로 부터의 목록 추력

package exam.Widget;

import android.app.*;
import android.os.*;
import android.widget.*;
import exam.AndroidExam.*;

public class ListFromArray extends Activity {
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.widget_listtest);

  ArrayAdapter<CharSequence> Adapter;
  Adapter = ArrayAdapter.createFromResource(this, R.array.country,
    android.R.layout.simple_list_item_1);

  ListView list = (ListView)findViewById(R.id.list);
  list.setAdapter(Adapter);
 }
}

 


4. 속성의 변경

package exam.Widget;

import android.app.*;
import android.graphics.drawable.*;
import android.os.*;
import android.widget.*;
import exam.AndroidExam.*;

public class ListAttr extends Activity {
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.widget_listtest);

  ArrayAdapter<CharSequence> Adapter;
  Adapter = ArrayAdapter.createFromResource(this, R.array.country,
    android.R.layout.simple_list_item_1);

  ListView list = (ListView)findViewById(R.id.list);
  list.setAdapter(Adapter);
  
  list.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
  list.setDivider(new ColorDrawable(0xffffff00));
  list.setDividerHeight(5);
 }
}

 

 

5. 항목의 편집

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical" android:layout_width="fill_parent"
 android:layout_height="fill_parent">
 <LinearLayout android:orientation="horizontal"
  android:layout_width="fill_parent" android:layout_height="wrap_content">
  <EditText android:id="@+id/newitem" android:layout_width="wrap_content"
   android:layout_height="wrap_content" android:layout_weight="4" />
  <Button android:id="@+id/add" android:layout_width="wrap_content"
   android:layout_height="wrap_content" android:text="Add"
   android:layout_weight="3" />
  <Button android:id="@+id/delete" android:layout_width="wrap_content"
   android:layout_height="wrap_content" android:text="Delete"
   android:layout_weight="3" />
 </LinearLayout>
 <ListView android:id="@+id/list" android:layout_width="fill_parent"
  android:layout_height="fill_parent" />
</LinearLayout>

 

 

package exam.Widget;

import java.util.*;

import android.app.*;
import android.os.*;
import android.view.*;
import android.widget.*;
import exam.AndroidExam.*;

public class ListAddDel extends Activity {
 ArrayList<String> Items;
 ArrayAdapter<String> Adapter;
 ListView list;

 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.widget_listadddel);

  Items = new ArrayList<String>();
  Items.add("First");
  Items.add("Second");
  Items.add("Third");

  Adapter = new ArrayAdapter<String>(this, android.R.layout.
    simple_list_item_single_choice, Items);
  list = (ListView)findViewById(R.id.list);
  list.setAdapter(Adapter);
  list.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

  list.setOnItemClickListener(mItemClickListener);
  findViewById(R.id.add).setOnClickListener(mClickListener);
  findViewById(R.id.delete).setOnClickListener(mClickListener);
 }

 Button.OnClickListener mClickListener = new View.OnClickListener() {
  public void onClick(View v) {
   EditText ed = (EditText)findViewById(R.id.newitem);
   switch (v.getId()) {
   case R.id.add:
    String text = ed.getText().toString();
    if (text.length() != 0) {
     Items.add(text);
     ed.setText("");
     Adapter.notifyDataSetChanged();
    }
    break;
   case R.id.delete:
    int id;
    id=list.getCheckedItemPosition();
    if (id != ListView.INVALID_POSITION) {
     Items.remove(id);
     list.clearChoices();
     Adapter.notifyDataSetChanged();
    }
    break;
   }
  }
 };
 
 AdapterView.OnItemClickListener mItemClickListener = new AdapterView.OnItemClickListener() {
  @SuppressWarnings("unchecked")
  public void onItemClick(AdapterView parent, View view, int position, long id) {
   String mes;
   mes = "Select Item = " + Items.get(position);
   Toast.makeText(ListAddDel.this,mes,Toast.LENGTH_SHORT).show();
  }
 };
}

 

 

6. 커스텀 항목의 처리

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent" android:layout_height="60px"
 android:padding="5px">
 <ImageView android:layout_width="wrap_content"
  android:layout_height="wrap_content" android:id="@+id/img"
  android:layout_alignParentLeft="true" />
 <TextView android:layout_width="wrap_content"
  android:layout_height="wrap_content" android:id="@+id/text"
  android:textColor="#00ff00" android:textSize="13pt"
  android:layout_toRightOf="@id/img" />
 <Button android:layout_width="wrap_content"
  android:layout_height="wrap_content" android:id="@+id/btn"
  android:layout_alignParentRight="true" android:text="주문" />
</RelativeLayout>

 


package exam.Widget;

import java.util.*;

import android.app.*;
import android.content.*;
import android.os.*;
import android.view.*;
import android.widget.*;
import exam.AndroidExam.*;

public class ListIconText extends Activity {
 ArrayList<MyItem> arItem;
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.widget_listtest);

  arItem = new ArrayList<MyItem>();
  MyItem mi;
  mi = new MyItem(R.drawable.icon, "삼성 노트북");arItem.add(mi);
  mi = new MyItem(R.drawable.icon, "LG 세탁기");arItem.add(mi);
  mi = new MyItem(R.drawable.icon, "대우 마티즈");arItem.add(mi);

  MyListAdapter MyAdapter = new MyListAdapter(this, R.layout.widget_icontext, arItem);

  ListView MyList;
  MyList=(ListView)findViewById(R.id.list);
  MyList.setAdapter(MyAdapter);
 }
}

//리스트 뷰에 출력할 항목
class MyItem {
 MyItem(int aIcon, String aName) {
  Icon = aIcon;
  Name = aName;
 }
 int Icon;
 String Name;
}

//어댑터 클래스
class MyListAdapter extends BaseAdapter {
 Context maincon;
 LayoutInflater Inflater;
 ArrayList<MyItem> arSrc;
 int layout;

 public MyListAdapter(Context context, int alayout, ArrayList<MyItem> aarSrc) {
  maincon = context;
  Inflater = (LayoutInflater)context.getSystemService(
    Context.LAYOUT_INFLATER_SERVICE);
  arSrc = aarSrc;
  layout = alayout;
 }

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

 public String getItem(int position) {
  return arSrc.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);
  }
  ImageView img = (ImageView)convertView.findViewById(R.id.img);
  img.setImageResource(arSrc.get(position).Icon);

  TextView txt = (TextView)convertView.findViewById(R.id.text);
  txt.setText(arSrc.get(position).Name);

  Button btn = (Button)convertView.findViewById(R.id.btn);
  btn.setOnClickListener(new Button.OnClickListener() {
   public void onClick(View v) {
    String str = arSrc.get(pos).Name + "를 주문합니다.";
    Toast.makeText(maincon, str, Toast.LENGTH_SHORT).show();
   }
  });

  return convertView;
 }
}

 


7. 항목 View의 조합

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="100px"
    android:gravity="bottom"
    >
<TextView 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft = "10px"
    android:layout_marginRight = "15px"
    android:id="@+id/text"
    android:textColor="#ffffff"
    android:textSize="20px"
    android:layout_gravity="bottom"
    />
<EditText
 android:id="@+id/edit" 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom"
    android:layout_marginLeft = "10px"
    android:layout_marginRight = "15px"
    android:textColor="#000000"
    android:textSize="20px"
    />
</LinearLayout>

 


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="70px"
    >
<Button
    android:layout_width="120px"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:id="@+id/btn" 
    android:text="Button"
    />
<ImageView android:layout_width="50px"
 android:layout_height="50px"
 android:id="@+id/img"
 android:layout_marginRight="10px"
 />
</LinearLayout>

 

 

package exam.Widget;

import java.util.*;

import android.app.*;
import android.content.*;
import android.os.*;
import android.view.*;
import android.widget.*;
import exam.AndroidExam.*;

public class ListOfViews extends Activity {
    ArrayList<ListItem> arItem;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.widget_listtest);
       
        arItem = new ArrayList<ListItem>();
        arItem.add(new ListItem(0,"제목","입력내용","",0));
        arItem.add(new ListItem(1,"","","push",R.drawable.icon));
        arItem.add(new ListItem(0,"이름을 입력하시오.","니 이름","",0));
        arItem.add(new ListItem(0,"나이도 입력하시오.","몇살이니","",0));
        arItem.add(new ListItem(1,"","","누르시오",R.drawable.icon));
        arItem.add(new ListItem(1,"","","업로드",R.drawable.icon));
        arItem.add(new ListItem(0,"주소","어디 사니?","",0));

        MultiAdapter MyAdapter = new MultiAdapter(this, arItem);
       
        ListView MyList;
        MyList=(ListView)findViewById(R.id.list);
        MyList.setAdapter(MyAdapter);
    }
}

class ListItem {
 ListItem(int aType, String aText, String aEditText, String aBtnText, int aIconRes) {
  Type = aType;
  Text = aText;
  EditText = aEditText;
  BtnText = aBtnText;
  IconRes = aIconRes;
 }
 int Type;
 String Text;
 String EditText;
 String BtnText;
 int IconRes;
}

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 int getCount() {
  return arSrc.size();
 }

 public ListItem getItem(int position) {
  return arSrc.get(position);
 }


 public long getItemId(int position) {
  return position;
 }
 
 public int getItemViewType(int position) {
  return arSrc.get(position).Type;
 }
 
 // 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.widget_textedit;
    break;
   case 1:
    res = R.layout.widget_btnicon;
    break;
   }
   convertView = mInflater.inflate(res, parent, false);
  }
  
  // 항목 뷰를 초기화한다.
  switch (arSrc.get(position).Type) {
  case 0:
   TextView txt = (TextView)convertView.findViewById(R.id.text);
   txt.setText(arSrc.get(position).Text);
   EditText edit = (EditText)convertView.findViewById(R.id.edit);
   edit.setText(arSrc.get(position).EditText);
   break;
  case 1:
   Button btn = (Button)convertView.findViewById(R.id.btn);
   btn.setText(arSrc.get(position).BtnText);
   ImageView img = (ImageView)convertView.findViewById(R.id.img);
   img.setImageResource(arSrc.get(position).IconRes);
   break;
  }

  return convertView;
 }
}

 

 

8. ListActivity

package exam.Widget;

import java.util.*;

import android.app.*;
import android.content.*;
import android.os.*;
import android.view.*;
import android.widget.*;

public class ListOnly extends ListActivity {
 ArrayList<String> arGeneral;
 protected void onCreate(Bundle savedInstanceState){
  super.onCreate(savedInstanceState);

  setContentView(R.layout.listActivity);

  arGeneral = new ArrayList<String>();
  arGeneral.add("김유신");
  arGeneral.add("이순신");
  arGeneral.add("강감찬");
  arGeneral.add("을지문덕");

  ArrayAdapter<String> Adapter;
  Adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, arGeneral);

  setListAdapter(Adapter);
 }

 public void onListItemClick(ListView list, View view, int position, long id) {
  String mes;
  mes = "Select Item = " + arGeneral.get(position);
  Toast.makeText(ListOnly.this,mes,Toast.LENGTH_SHORT).show();
 }
}

 

 

[03] AdapterView

1. Spinner
arrays.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="country">
        <item>신라</item>
        <item>고구려</item>
        <item>백제</item>
        <item>당나라</item>
        <item>발해</item>
        <item>옥저</item>
        <item>동예</item>
        <item>부여</item>
        <item>대한민국</item>
    </string-array>
    <string-array name="fruits">
        <item>사과</item>
        <item>딸기</item>
        <item>수박</item>
        <item>바나나</item>
        <item>감</item>
        <item>복숭아</item>
        <item>자두</item>
    </string-array>
    <string-array name="foods">
        <item>짜장면</item>
        <item>우동</item>
        <item>짬뽕</item>
        <item>탕수육</item>
    </string-array>
</resources>

 


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView 
 android:id="@+id/mytext"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="먹고 싶은 과일을 선택하세요."
    />
<Spinner
 android:id="@+id/myspinner"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    />
</LinearLayout>

 

 

package exam.Widget;

import android.app.*;
import android.os.*;
import android.view.*;
import android.widget.*;
import android.widget.AdapterView.*;
import exam.AndroidExam.*;

public class SpinnerTest extends Activity {
 ArrayAdapter<CharSequence> adspin;
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.widget_spinnertest);

  Spinner spin = (Spinner)findViewById(R.id.myspinner);
  spin.setPrompt("과일을 고르세요.");

  adspin = ArrayAdapter.createFromResource(this, R.array.fruits,
    android.R.layout.simple_spinner_item);
  adspin.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
  spin.setAdapter(adspin);

  spin.setOnItemSelectedListener(new OnItemSelectedListener() {
   public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
    Toast.makeText(SpinnerTest.this,adspin.getItem(position) + "는 맛있다.",
      Toast.LENGTH_SHORT).show();
   }
   public void onNothingSelected(AdapterView<?> parent) {
   }
  });
 }
}

 

 

2. Grid

<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/grid" 
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="10dp"
    android:verticalSpacing="10dp"
    android:horizontalSpacing="10dp"
    android:numColumns="auto_fit"
    android:columnWidth="60dp"
    android:stretchMode="columnWidth"
    android:gravity="center"
 />

 


package exam.Widget;

import android.app.*;
import android.content.*;
import android.os.*;
import android.view.*;
import android.widget.*;
import android.widget.AdapterView.*;
import exam.AndroidExam.*;

public class GridTest extends Activity {
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.widget_gridtest);

  GridView grid = (GridView)findViewById(R.id.grid);
  ImageAdapter Adapter = new ImageAdapter(this);
  grid.setAdapter(Adapter);
  
  grid.setOnItemClickListener(new OnItemClickListener() {
   public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    Toast.makeText(GridTest.this, position + "번째 그림 선택",
      Toast.LENGTH_SHORT).show();
   }
  });
 }
}

class ImageAdapter extends BaseAdapter {
 private Context mContext;

 int[] picture = { R.drawable.pride, R.drawable.dog, R.drawable.cloud };

 public ImageAdapter(Context c) {
  mContext = c;
 }

 public int getCount() {
  return 100;
 }

 public Object getItem(int position) {
  return picture[position % 3];
 }

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

 public View getView(int position, View convertView, ViewGroup parent) {
  ImageView imageView;
  if (convertView == null) {
   imageView = new ImageView(mContext);
   imageView.setLayoutParams(new GridView.LayoutParams(45, 45));
   imageView.setAdjustViewBounds(false);
   imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
   imageView.setPadding(8, 8, 8, 8);
  } else {
   imageView = (ImageView) convertView;
  }

  imageView.setImageResource(picture[position % 3]);

  return imageView;
 }
}

 

 

3. Gallery

<?xml version="1.0" encoding="utf-8"?>
<Gallery xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/gallery"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:spacing="5px"
 android:animationDuration="1500"
/>

 

 

package exam.Widget;

import android.app.*;
import android.content.*;
import android.os.*;
import android.view.*;
import android.widget.*;
import exam.AndroidExam.*;

public class GalleryTest extends Activity {
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.widget_gallerytest);

  Gallery g = (Gallery) findViewById(R.id.gallery);
        g.setAdapter(new ImageAdapter2(this));
 }
}

class ImageAdapter2 extends BaseAdapter {
 private Context mContext;
 private int[] mImageIds = {
   R.drawable.ccdam,
   R.drawable.soyang2,
   R.drawable.ududong,
   R.drawable.zipdarigol,
   R.drawable.dongul,
   R.drawable.lotteworld,
 };

 public ImageAdapter2(Context c) {
  mContext = c;
 }

 public int getCount() {
  return mImageIds.length;
 }

 public Object getItem(int position) {
  return mImageIds[position];
 }

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

 public View getView(int position, View convertView, ViewGroup parent) {
  ImageView imageView;
  
  if (convertView == null) {
   imageView = new ImageView(mContext);
  } else {
   imageView = (ImageView)convertView;
  }

  imageView.setImageResource(mImageIds[position]);
  imageView.setScaleType(ImageView.ScaleType.FIT_XY);
  imageView.setLayoutParams(new Gallery.LayoutParams(136, 88));

  return imageView;
 }
}

 

 

 

Posted by ▶파이팅◀

블로그 이미지
Let's start carefully from the beginning
▶파이팅◀

태그목록

공지사항

Yesterday
Today
Total

달력

 « |  » 2024.4
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

최근에 올라온 글

최근에 달린 댓글

글 보관함