프로젝트 진행 중에 어레이어답터를 커스텀으로 사용해야 할 일이 자주 생겨
기본적으로 필요한 틀을 만들어 놓은것을 공유합니다.
필요한 자바파일은
- 리스트뷰가 있는 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 |
자동 로그인 여부, 또는 설정에서 저장했던 값 등
앱이 종료되어도 보존되어야 하는 데이터를 저장할 때
흔히 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);
이런식으로 사용된다.
'Android' 카테고리의 다른 글
안드로이드] 쉬운 log 관리 (0) | 2013.07.26 |
---|---|
안드로이드] Custom ArrayAdapter의 기본 틀 (0) | 2013.07.25 |
안드로이드] 몇 분 전, 몇 시간 전, 몇 달 전 등 나타내기 (0) | 2013.05.06 |
안드로이드] SpannableStringBuilder를 사용하여 String 영역 Color 바꾸기 (0) | 2013.05.06 |
안드로이드] EditText hint의 Color, Size 값 주기 (0) | 2013.04.15 |
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형태로 변환해 준 다음
파라미터로 넘겨주면 알맞은 리턴값이 돌아오게 된다.
'Android' 카테고리의 다른 글
안드로이드] Custom ArrayAdapter의 기본 틀 (0) | 2013.07.25 |
---|---|
안드로이드] SharedPreferences 깔끔하게 사용하기 (9) | 2013.07.09 |
안드로이드] SpannableStringBuilder를 사용하여 String 영역 Color 바꾸기 (0) | 2013.05.06 |
안드로이드] EditText hint의 Color, Size 값 주기 (0) | 2013.04.15 |
안드로이드] Java소스 상에서 Color 값 주기 (0) | 2013.04.10 |