2010/02/22 15:43

복사 http://blog.naver.com/yhr40017/100100499196

첨부파일 (4)

안드로이드 ListView + ArrayAdapter 활용법에 대해 올려봅니다.

 

원래는 TableLayout을 이용하면 화면에 뿌리는거는 HTML이나 FLEX처럼 보여줄 수 있으나,

 

column, row, cell단위로 click하여 event를 처리하기에는 ListView + ArrayAdapter을 사용해야하는데 이에 대한 자세한 내용이 있는 곳이 별로 없어서 올려봅니다.

 

표현하려는 내용은 간단히 ListView에 2개의 TextView와 하나의 Button을 row로 갖는 grid형태의 TableList를 표현해보도록 하겠습니다.

 

1. 먼저 ListView의 row에 들어갈 view를 다음(list_row.xml)과 같이 작성합니다.

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="horizontal"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:padding="4dip">
  <TextView
   android:id="@+id/code"
   android:layout_width="wrap_content"
   android:layout_height="fill_parent"
   android:padding="4dip" />
  <TextView
   android:id="@+id/msg"
   android:layout_width="wrap_content"
   android:layout_height="fill_parent"
   android:padding="4dip" />
  <Button
   android:id="@+id/btn"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:padding="4dip" />
</LinearLayout>

 

2. ListView의 row를 표시한 item을 다음과 같이 정의하겠습니다.

 

public class Item extends TableList {
 private String code;
 private String msg;
 
 public Item(String code, String msg) {
  this.code = code;
  this.msg = msg;
 }
 
 public String getCode() { return this.code; }
 public String getMsg() { return this.msg; }
 public String toString() { return this.code + ", " + this.msg; }
}

 

3. 해당 item 정보를 ListView의 ArrayAdapter로 맵핑하기 위해 ArrayAdapter를 상속받아서 다음과 같이 getView 메쏘드를 작성합니다. ListView를 그리기 위해 현재 Item위치(position), convertView(list_row.xml), parent(ListView) 정보 parameter를 이용하여 해당 row의 정보를 설정하게 되며 다음과 같이 작성된다.

 

public class ItemAdapter extends ArrayAdapter<Item> {
 private ArrayList<Item> itemList;
 private Context context;
 private int rowResourceId;
 
 public ItemAdapter(Context context, int textViewResourceId, ArrayList<Item> itemList) {
        super(context, textViewResourceId, itemList);
        //ListView의 row정보를 저장하는 ArrayList.

        this.itemList = itemList;
        this.context = context;

        // list_row.xml의 id. getView 메쏘드에서 추가될 item의 position에 해당 view를 inflate하기 위해 저장
        this.rowResourceId = textViewResourceId;
 }
 
 @Override
    public View getView(int position, View convertView, ViewGroup parent) {
            View v = convertView;
            if (v == null) {

                // LayoutInflater를 이용하여 list_row를 view로 설정한다.
                LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                v = vi.inflate(this.rowResourceId, null);
            }

            // 그려지게될 ListView의 현재 row 위치(position) item 정보를 얻어온다.
            Item item = itemList.get(position);
            if (item != null) {

                    // 선택된 row의 데이터를 표시한다. 표시될 view는 list_row.xml의 각 항목을 이용하여 표시한다.
                    TextView codeView = (TextView) v.findViewById(R.id.code);
                    TextView msgView = (TextView) v.findViewById(R.id.msg);
                    Button btn = (Button) v.findViewById(R.id.btn);
                   
                    if (codeView != null)
                     codeView.setText(item.getCode());
                    if (msgView != null)
                     msgView.setText(item.getMsg());
                    if (btn != null)
                     btn.setText("button:"+position);
            }
            return v;
    }
}

 

4. 끝으로 해당 정보를 그려줘야할 Activity를 다음과 같이 작성합니다.

 

public class TableList extends Activity {
 
 //main.xml의 ListView
 private ListView myView;
 //ListView에 데이터를 맵핑해 주게될 ArrayAdapter를 확장 구현한 Adapter
 private ItemAdapter itemAdapter;
 //ItemAdapter(ArrayAdapter)에 데이터를 제공하게될 ArrayList
 private ArrayList <Item> itemList= new ArrayList<Item>();
 
 //UI에 데이터가 변경된 경우 다시 그려주게될 Runnable interface. 데이터를 갱신하고, 이를 화면에
 //반영해야할 경우에는 반드시 Activity의 runOnUiThread(Runnable r) 메쏘드를 이용해서 호출해야
 //실시간으로 화면에 반영됩니다.
 private Runnable updateUI = new Runnable() {
  public void run() {
   TableList.this.itemAdapter.notifyDataSetChanged();
  }
 };
 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //main.xml에서 ListView id를 얻어온다.
        myView = (ListView) this.findViewById(R.id.listView);
        //ListView의 데이터 Adapter를 초기화해준다.
        itemAdapter = new ItemAdapter(this, R.layout.list_row, itemList);
        myView.setAdapter(itemAdapter);
    }
   
   
    @Override
 protected void onResume() {
  // TODO Auto-generated method stub
  super.onResume();
  
  //화면이 나타나면 임의의 정보를 ListView에 표시한다.
  String code;
  String msg;
  int itemCount = 5;
  for(int i=0;i<itemCount;i++) {
   code = "item" + i;
   msg = "message" + i;
   Item item = new Item(code, msg);
   this.addItem(item);
  }
 }


 private void addItem(Item item) {
  // ArrayList에 데이터를 추가하고, 화면에 반영하기 위해runOnUiThread()를 호출하여 실시간 갱신한다.
     this.itemList.add(item);
     this.runOnUiThread(updateUI);
    }
}

+ Recent posts