[ListView #5] 사용자 Layout을 이용한 List [BaseAdapter 사용]
반응형
이번에는 BaseAdapter를 사용하여 리스트를 생성해보자.
각 리스트에는 두줄의 TextView와 하나의 Chekbox가 포함되어 있다.
------------------------------------------------------------------------
1. 기본이 되는 Layout을 구성한다.
ListActivity를 사용할 것이기에 Id을 아래와 같이 해주어야된다.
android:id="@id/android:list"
repeat_menu_del_list.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" android:orientation="vertical">
<ListView android:id="@id/android:list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:scrollbars="vertical"
android:choiceMode="multipleChoice"
android:clickable="true"
android:drawSelectorOnTop="false"/>
</LinearLayout>
------------------------------------------------------------------------
2. 각 List에 구조를 정의하는 Layout을 구성한다.
체크박스와 두줄이 하나의 리스트가 되게 한다.
repeat_menu_del_list_row.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:paddingLeft="4dip"
>
<CheckedTextView android:id="@+id/repeatMenuDelListCheckBox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:checkMark="?android:attr/listChoiceIndicatorMultiple"/>
<LinearLayout android:id="@+id/layout001"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/repeatMenuDelListCheckBox">
<TextView android:id="@+id/repeatMenuDelListTag"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dip"
android:layout_marginTop="5dip"
android:ellipsize="marquee"
android:textAppearance="?android:attr/textAppearanceLarge"/>
<TextView android:id="@+id/repeatMenuDelListFilename"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dip"
android:layout_alignBaseline="@id/repeatMenuDelListTag"
android:singleLine="true"
android:ellipsize="marquee"
android:textAppearance="?android:attr/textAppearanceSmall"/>
</LinearLayout>
</RelativeLayout>
</LinearLayout>
------------------------------------------------------------------------
3. ListActivity를 구성한다.
public class RepeatMenuDelList extends ListActivity {
private Context mContext;
//PlayerRepeatABInfo은 다른 용도로 사용하기 위해서 만든 데이타 타입 객체입니다.
private ArrayList<PlayerRepeatABInfo> mArrayList;
private DelListAdapter mAdapter;
private Bundle mSelectedIndexSet; //체크박스를 위해서 추가됨.
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = this;
setContentView(R.layout.repeat_menu_del_list);
setTitle(getString(R.string.repeatMenuDelListTitle));
mArrayList = new ArrayList<PlayerRepeatABInfo>();
mSelectedIndexSet = new Bundle();
mAdapter = new DelListAdapter(mContext);
setListAdapter(mAdapter);
}
protected void onResume() {
super.onResume();
if(mArrayList == null)
mArrayList = new ArrayList<PlayerRepeatABInfo>();
if (mSelectedIndexSet == null)
mSelectedIndexSet = new Bundle();
//mArrayList 을 채우주는 넘입니다. 메서드 내용은 복잡하여 skip합니다.
LoadRepeatDataFromDir();
//ArrayList를 채워주고 adapter에 알려줍니다.
mAdapter.notifyDataSetChanged();
}
------------------------------------------------------------------------
4. BaseAdapter를 상속받는 객체를 만듭니다.
[Subclass로 만들어도 되고, 새로운 Java파일로 만들어도 됩니다. 저는 Sub로 만들었습니다.]
getView에서 그릴 녀석들에 대한 데이타 처리를 합니다. [bindView()으로 토스해서 처리했습니다. ^^]
public class DelListAdapter extends BaseAdapter{
protected LayoutInflater mInflater;
public DelListAdapter(Context context) {
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
if (convertView != null) {
view = convertView;
} else {
view = newView(parent);
}
bindView(view, position);
return view;
}
private void bindView(View view, int position) {
ListItemViews views = (ListItemViews) view.getTag();
if (mSelectedIndexSet.containsKey("" + position)) {
views.check.setChecked(true);
} else {
views.check.setChecked(false);
}
PlayerRepeatABInfo temp = mArrayList.get(position);
String sTag = temp.getTagOfUser();
String sFilename = temp.getFilePath();
views.tag.setText(sTag);
views.filename.setText(sFilename);
}
private View newView(ViewGroup parent) {
ListItemViews views = new ListItemViews();
View v = mInflater.inflate(R.layout.repeat_menu_del_list_row, parent, false);
views.check = (CheckedTextView) v.findViewById(R.id.repeatMenuDelListCheckBox);
views.tag = (TextView) v.findViewById(R.id.repeatMenuDelListTag);
views.filename = (TextView) v.findViewById(R.id.repeatMenuDelListFilename);
v.setTag(views);
return v;
}
@Override
public int getCount() {
return mArrayList.size();
}
@Override
public Object getItem(int arg0) {
return mArrayList.get(arg0);
}
@Override
public long getItemId(int arg0) {
if (mArrayList.size() < 1) {
return -1;
}
return arg0;
}
}
반응형
'IT > Android[안드로이드]' 카테고리의 다른 글
[Menu #2] 컨텍스트 메뉴 기본 구성하기 (0) | 2010.12.15 |
---|---|
[Menu #1] 간단한 옵션메뉴 추가 (0) | 2010.12.14 |
[Activity #4] 투명화 시켜 밑에 activity 보이게 하기. (0) | 2010.12.09 |
[Title #1] Title 숨김 (0) | 2010.12.09 |
[Activity #2] startActivityForResult (0) | 2010.12.06 |