Android
2013. 7. 25. 16:09
프로젝트 진행 중에 어레이어답터를 커스텀으로 사용해야 할 일이 자주 생겨
기본적으로 필요한 틀을 만들어 놓은것을 공유합니다.
필요한 자바파일은
- 리스트뷰가 있는 MainActivity
- BaseAdapter를 상속 받고있는MainListAdapter
- 콘텐츠가 들어있는 ExamEntity
필요한 xml 파일은
- MainActivity의 Layout인 activity_main.xml
- 리스트 row를 구성 할 item_row.xml
입니다.
< MainActivity>
public class MainActivity extends Activity { private final String TAG = "MainActivity"; // list private ListView lv_main; private ArrayListmExamItemArrayList; private MainListAdapter mMainListAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d(TAG, "onCreate"); viewInit(); setContent(); } /** * init mainview */ private void viewInit() { Log.d(TAG, "viewInit"); lv_main = (ListView) findViewById(R.id.lv_main); mExamItemArrayList = new ArrayList (); mMainListAdapter = new MainListAdapter(getApplicationContext(), mExamItemArrayList, R.layout.item_row); lv_main.setAdapter(mMainListAdapter); } /** * set content */ private void setContent() { Log.d(TAG, "setContent"); for (int itemCount = 0; itemCount < 20; itemCount++) { ExamEntity mExamEntity = new ExamEntity(); mExamEntity.title = "Title : " + itemCount; mExamEntity.content = "Content : " + itemCount; mExamItemArrayList.add(mExamEntity); } mMainListAdapter.notifyDataSetChanged(); } }
MainActivity에선 기본적은 어답터와 리스트뷰 연결 등의 초기 작업을 하고
setContent 매소드를 통하여 entity에 리스트 row에 뿌릴 콘텐츠를 저장합니다.
<MainListAdapter>
public class MainListAdapter extends BaseAdapter { final String TAG = "MainListAdapter"; public Context mContext; private ArrayListmExamItemArrayList; private LayoutInflater mLayoutInflater; int resource; public MainListAdapter(Context context, ArrayList mExamItemArrayList, int resource) { mContext = context; this.mExamItemArrayList = mExamItemArrayList; this.mLayoutInflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); this.resource = resource; } @Override public int getCount() { // TODO Auto-generated method stub return mExamItemArrayList.size(); } @Override public Object getItem(int arg0) { // TODO Auto-generated method stub return null; } @Override public long getItemId(int arg0) { // TODO Auto-generated method stub return 0; } @Override public View getView(final int position, View convertView, ViewGroup parent) { Holder holder = new Holder(); if (convertView == null) { convertView = mLayoutInflater.inflate(resource, null); // find resource holder.tv_title = (TextView) convertView .findViewById(R.id.tv_title); holder.tv_content = (TextView) convertView .findViewById(R.id.tv_content); convertView.setTag(holder); } else { holder = (Holder) convertView.getTag(); } // set content String title = mExamItemArrayList.get(position).title; String content = mExamItemArrayList.get(position).content; holder.tv_title.setText(title); holder.tv_content.setText(content); // set click listener holder.tv_title.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(mContext, mExamItemArrayList.get(position).title, Toast.LENGTH_SHORT).show(); } }); holder.tv_content.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(mContext, mExamItemArrayList.get(position).content, Toast.LENGTH_SHORT).show(); } }); return convertView; } private class Holder { TextView tv_title, tv_content; } }
MainListAdapter에선, row에서 쓸 텍스트뷰를 선언하고 MainActivity에서 넘겨받은
ArrayList를 이용하여 ExamEntity의 콘텐츠들을 꺼내어 쓰게됩니다.
<ExamEntity>
public class ExamEntity {
public String title;
public String content;
}
기본적인 entity입니다. setter와 getter를 추가 할 수 있습니다.
위 기본틀을 붙여놓고 필요에 따라 리스트 row를 구성하는 row.xml을 수정하고
그에 맞게 entity, holder, getView()매소드를 수정하여 원하는 리스트뷰를 구성 할 수 있습니다.
소스 첨부 합니다.
'Android' 카테고리의 다른 글
안드로이드] 페이스북 같은 슬라이드 메뉴 만들기 (49) | 2013.08.19 |
---|---|
안드로이드] 쉬운 log 관리 (0) | 2013.07.26 |
안드로이드] SharedPreferences 깔끔하게 사용하기 (9) | 2013.07.09 |
안드로이드] 몇 분 전, 몇 시간 전, 몇 달 전 등 나타내기 (0) | 2013.05.06 |
안드로이드] SpannableStringBuilder를 사용하여 String 영역 Color 바꾸기 (0) | 2013.05.06 |