올해는 머신러닝이다.
안드로이드(android) ListView + ArrayAdapter ANDROID 본문
2010/02/22 15:43 http://blog.naver.com/yhr40017/100100499196
|
안드로이드 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);
}
}
'Android > Tip&Tech' 카테고리의 다른 글
ArrayAdapter의 인자값은 객체 배열이 아닌 Collection 으로 던져주자! (0) | 2010.11.05 |
---|---|
ListView에 동적으로 아이템 추가시 스크롤 문제! (0) | 2010.11.04 |
listview에 버튼넣기 (0) | 2010.11.03 |
AIDL이 뭘까나? (0) | 2010.11.03 |
안드로이드 서비스 팁 (0) | 2010.11.03 |