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 젊은쎄오
:
Android 2013. 7. 9. 17:48

자동 로그인 여부, 또는 설정에서 저장했던 값 등


앱이 종료되어도 보존되어야 하는 데이터를 저장할 때 


흔히 SharedPreferences를 사용한다. 


	SharedPreferences pref = mContext.getSharedPreferences(com.exam.pref,
				Activity.MODE_PRIVATE);
	SharedPreferences.Editor editor = pref.edit();
	editor.putString("key", value);
	editor.commit();


보통 이런식으로 사용하는데 이는 키 값을 수정 할 일이 있거나


찾을 일이 있을 때 따로 키 목록을 작성해 


놓은 곳이 없다면 나중에 관리가 힘들어지는 단점이 있다. 




그래서 아예  Preference 클래스를 하나 만들어 두고 그 클래스에 


int, String, boolean을 담고 꺼내는 getter, setter 매소드와 


사용하는 키 값을 모두 선언하여 


클래스에 점만 찍으면 키, 저장, 꺼내쓰기가 가능하도록 하였다. 



public class RbPreference {

	private final String PREF_NAME = "com.rabiaband.pref";

	public final static String PREF_INTRO_USER_AGREEMENT = "PREF_USER_AGREEMENT";
	public final static String PREF_MAIN_VALUE = "PREF_MAIN_VALUE";
	

	static Context mContext;

	public RbPreference(Context c) {
		mContext = c;
	}

	public void put(String key, String value) {
		SharedPreferences pref = mContext.getSharedPreferences(PREF_NAME,
				Activity.MODE_PRIVATE);
		SharedPreferences.Editor editor = pref.edit();

		editor.putString(key, value);
		editor.commit();
	}

	public void put(String key, boolean value) {
		SharedPreferences pref = mContext.getSharedPreferences(PREF_NAME,
				Activity.MODE_PRIVATE);
		SharedPreferences.Editor editor = pref.edit();

		editor.putBoolean(key, value);
		editor.commit();
	}

	public void put(String key, int value) {
		SharedPreferences pref = mContext.getSharedPreferences(PREF_NAME,
				Activity.MODE_PRIVATE);
		SharedPreferences.Editor editor = pref.edit();

		editor.putInt(key, value);
		editor.commit();
	}

	public String getValue(String key, String dftValue) {
		SharedPreferences pref = mContext.getSharedPreferences(PREF_NAME,
				Activity.MODE_PRIVATE);

		try {
			return pref.getString(key, dftValue);
		} catch (Exception e) {
			return dftValue;
		}

	}

	public int getValue(String key, int dftValue) {
		SharedPreferences pref = mContext.getSharedPreferences(PREF_NAME,
				Activity.MODE_PRIVATE);

		try {
			return pref.getInt(key, dftValue);
		} catch (Exception e) {
			return dftValue;
		}

	}

	public boolean getValue(String key, boolean dftValue) {
		SharedPreferences pref = mContext.getSharedPreferences(PREF_NAME,
				Activity.MODE_PRIVATE);

		try {
			return pref.getBoolean(key, dftValue);
		} catch (Exception e) {
			return dftValue;
		}
	}
}


위와 같이 상단에 각각 사용할 키를 선언하고 타입별로 같은 이름의 setter,getter 매소드를


만들어 놓으면 어디서든 위 클래스를 이용하여 해당키와 한가지 매소드로 원하는 작업 수행이 가능하다.



RbPreference pref = new RbPreference(this);

// set
pref.put(RbPreference.PREF_USER_AGREEMENT, true);

// get
pref.getValue(RbPreference.PREF_USER_AGREEMENT, false);


이런식으로 사용된다. 


posted by 젊은쎄오
:
Android 2013. 5. 6. 23:55

sns에서 자주보이는 현재 보여지는 글이 쓰여진 시점부터 


지금까지의 시간을 표현하는 방법이다. 


출처는 http://gubok.tistory.com/227 여기이고 아래는 소스이다. 



private static class TIME_MAXIMUM{
        public static final int SEC = 60;
        public static final int MIN = 60;
        public static final int HOUR = 24;
        public static final int DAY = 30;
        public static final int MONTH = 12;
}


public static String formatTimeString(Date tempDate) {

	long curTime = System.currentTimeMillis();
	long regTime = tempDate.getTime();
	long diffTime = (curTime - regTime) / 1000;

	String msg = null;
	if (diffTime < TIME_MAXIMUM.SEC) {
			// sec
		msg = "방금 전";
	} else if ((diffTime /= TIME_MAXIMUM.SEC) < TIME_MAXIMUM.MIN) {
		// min
		msg = diffTime + "분 전";
	} else if ((diffTime /= TIME_MAXIMUM.MIN) < TIME_MAXIMUM.HOUR) {
		// hour
		msg = (diffTime) + "시간 전";
	} else if ((diffTime /= TIME_MAXIMUM.HOUR) < TIME_MAXIMUM.DAY) {
		// day
			msg = (diffTime) + "일 전";
	} else if ((diffTime /= TIME_MAXIMUM.DAY) < TIME_MAXIMUM.MONTH) {
		// day
	        msg = (diffTime) + "달 전";
	} else {
		msg = (diffTime) + "년 전";
	}

	return msg;
}



이 부분만 있으면 구현 가능하다. 


그러나 나는 날짜가 yyyy-mm-dd hh:mm:ss format의 String형식으로  


넘어오고 있었기 때문에 이 String을 위와 같은 format의 Date 변수로 변환하는 부분이 필요했다.


String stringDate = "2013-05-06 14:42:00";
java.text.SimpleDateFormat format = new java.text.SimpleDateFormat(
			"yyyy-MM-dd HH:mm:ss");
java.util.Date date = format.parse(stringDate);


위와 같이 format 형태를 상황에 맞게 만들어 date형태로 변환해 준 다음 


파라미터로 넘겨주면 알맞은 리턴값이 돌아오게 된다. 



posted by 젊은쎄오
: