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 ArrayList mExamItemArrayList;
	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 ArrayList mExamItemArrayList;
	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()매소드를 수정하여 원하는 리스트뷰를 구성 할 수 있습니다.







소스 첨부 합니다.




ListAdapterExample.zip









posted by 젊은쎄오
: