저번 글에 뻘짓만 하고 code 안알려줘서 빡친 분들 더러 더러 있을 꺼 같아서
인좌부터 code로 까 놓고 직접 설명 해줄께요.
(님들아 돌 내려놔여...)
기본 가정으로 ListView, Adapter, Provider 구성은 할 줄 안다고 가정 하고 시작 합니다.
기본 코드 출처는 ContactsProvider에 있었음.
(다년 간? 다뤄본 경험에 비추어 가장 좋은 방법? 이라고 판단됨 - 지극히 주관적 ㅋㅋ)
우선 Provider 에서 query 부분을 수정 해야함.
대부분 보통 상태라면 cursor를 return 해야 되기 땜시롱.
case DATA :
Cursor cursor = database.query(테이블명, 프로젝션, 조건문, 조건문인자, 그룹바이, 해빙, 소트)
break;
요딴식으로 되어 있을 꺼임. 이걸 수정을 가해서 index를 같이 전달 해주도록 고칠 예정임
case DATA :
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
Cursor cursor = database.query(테이블명, 프로젝션, 조건문, 조건문인자, 그룹바이, 해빙, 소트)
qb.setTables(테이블명);
// 요고는 안써도 되는듯
// 요고는 안써도 되는듯
cursor = bundleLetterCountExtras(cursor, database, qb, selection, selectionArgs, sortOrder);
일케 고치고 나면.
bundleLetterCountExtras(cursor, database, qb, selection, selectionArgs, sortOrder);
이 함수 부분이 매우 궁금 할 꺼임? 글치 않음 님덜?
private Cursor bundleLetterCountExtras(Cursor cursor, final SQLiteDatabase db, SQLiteQueryBuilder qb, String selection, String[] selectionArgs, String sortOrder) { String sortKey; String sortOrderSuffix = ""; if (sortOrder != null) { int spaceIndex = sortOrder.indexOf(' '); if (spaceIndex != -1) { sortKey = sortOrder.substring(0, spaceIndex); sortOrderSuffix = sortOrder.substring(spaceIndex); } else { sortKey = sortOrder; } } String subSortKey = "SUBSTR(" + sortKey + ",1,1)"; String locale = getLocale().toString(); HashMapprojectionMap = new HashMap (); projectionMap.put(AddressBookIndexQuery.LETTER, subSortKey + " AS " + AddressBookIndexQuery.LETTER); projectionMap.put(AddressBookIndexQuery.TITLE, "GET_PHONEBOOK_INDEX(" + subSortKey + ",'" + locale + "')" + " AS " + AddressBookIndexQuery.TITLE); projectionMap.put(AddressBookIndexQuery.COUNT, "COUNT(" + sortKey + ") AS " + AddressBookIndexQuery.COUNT); qb.setProjectionMap(projectionMap); Cursor indexCursor = qb.query(db, null, selection, selectionArgs, AddressBookIndexQuery.ORDER_BY, null /* having */, AddressBookIndexQuery.ORDER_BY + sortOrderSuffix); try { int groupCount = indexCursor.getCount(); String titles[] = new String[groupCount]; int counts[] = new int[groupCount]; int indexCount = 0; String currentTitle = null; int count = 0; for (int i = 0; i < groupCount; i++) { indexCursor.moveToNext(); int latter = indexCursor.getInt(AddressBookIndexQuery.COLUMN_LETTER); String title = indexCursor.getString(AddressBookIndexQuery.COLUMN_TITLE); count = latter; if (indexCount == 0 || !TextUtils.equals(title, currentTitle)) { titles[indexCount] = currentTitle = title; counts[indexCount] = count; indexCount++; } else { counts[indexCount - 1] += count; } } if (indexCount < groupCount) { String[] newTitles = new String[indexCount]; System.arraycopy(titles, 0, newTitles, 0, indexCount); titles = newTitles; int[] newCounts = new int[indexCount]; System.arraycopy(counts, 0, newCounts, 0, indexCount); counts = newCounts; } final Bundle bundle = new Bundle(); bundle.putStringArray("님덜 맘대로", titles); bundle.putIntArray("님덜 맘대로", counts); return new CursorWrapper(cursor) { @Override public Bundle getExtras() { return bundle; } }; } finally { indexCursor.close(); } }
글구 몇가지 또 빼먹은 것도 있고 움케케케... 하지만 나머지 설명은 3탄에 할 계획이란거!!
난 이걸로 12편까지 만들고 싶... (응? 거기 퍼갈땐 댓글!!)
'Android' 카테고리의 다른 글
Android List에 index를 표시해보자 4편 (0) | 2012.02.08 |
---|---|
Android List에 index를 표시해보자 3편 (0) | 2012.02.08 |
Android List에 index를 표시해보자 1편 (0) | 2012.02.08 |
Android base component - ListView (0) | 2011.10.20 |
Android - Activity (0) | 2011.10.02 |