저번 글에 뻘짓만 하고 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(테이블명);
// 요고는 안써도 되는듯 
// qb.setStrictProjectionMap(true);
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();
    HashMap projectionMap = 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편까지 만들고 싶...  (응? 거기 퍼갈땐 댓글!!)



+ Recent posts