[ListView #5] 사용자 Layout을 이용한 List [BaseAdapter 사용]

Posted by [하늘이]
2010. 12. 14. 16:04 IT/Android[안드로이드]
반응형
이번에는 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;
}
}




반응형