2016년 6월 22일 수요일

[월간 AJ TED 제 10호] 노래방 고민을 한방에 해결한 노래방 18번 앱을 업데이트하였습니다.

노래방 고민을 한방에 해결한

노래방 18번 앱을 업데이트하였습니다.


1. 세대별(나이별) 노래 목록 보기 기능

2. 분위기별로 노래 목록 보기 기능

3. 남/여별로 노래 목록 보기 기능

4. 나의 18번으로 등록하여 나의 노래만 보기 기능

5. 새로운 노래 등록하기 기능

6. 노래가사/가수명/노래제목 보기 기능

7. 선택 노래 미리 들어보기 기능

8. 최신 노래 목록 업데이트 기능










2016년 6월 20일 월요일

[안드로이드 개발] ListView의 항목이 중복해서 보일 때 해결방법


ListView의 경우 가려져 있다가 보이는 경우

기존 뷰를 재사용해서 표시한다고 한다.

else 부분의 루틴을

vh = (ViewHolder) convertView.getTag(); 
와 같이 처리했을 경우
동일한 내용이 반복해서 보일 수 있다.

노란색 음영으로 되어 있는 저 부분이

핵심이다.

결론적으로 재사용된 뷰의 표시내용을 변경해주면

해결된다.



@Override
public View getView(final int position, View convertView, ViewGroup parent) {

    ViewHolder vh;
    if(convertView==null){
        vh = new ViewHolder();
        convertView =(LinearLayout) inflater.inflate(R.layout.list_menu, null);

        vh.mText=(TextView) convertView.findViewById(R.id.Name);
        vh.mImage=(ImageView) convertView.findViewById(R.id.Icon);
        vh.mCheckBox=(CheckBox) convertView.findViewById(R.id.mCheckbox);

        convertView.setTag(vh); 
    } else { 
        vh = (ViewHolder) convertView.getTag(); 
    } 

    vh.mText.setText(mName.get(position));
    vh.mImage.setImageDrawable(mIcon.get(position));
    vh.mCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton check, boolean isChecked) {
            if(check.isChecked()){
                Toast.makeText(mContext, "..."+mName.get(position)+"..."+position, Toast.LENGTH_SHORT).show();
            }
        }
    });
    return convertView;
}

[안드로이드 개발] 미리 만들어 놓은 Database를 불러와서사용하기

미리 만들어 놓은 sqlite 데이타베이스를 

불러와서 사용하는 방법에 대해 알아보자.

특히 사전 등과 같이 많은 데이타가 앱인 경우 

앱에 포함시켜 배포하고 최초 실행시 복사하여

사용한다.

---------------------[작업 순서]------------------------

1. assets/db 폴더를 생성한다.

- 안드로이드 app/src/main/ 아래 직접 생성한다.

- db폴더안에 database파일을 복사하여 둔다.


2. App 최초실행시 내부로 복사한다.

- onCreate 함수에서 기존의 테이블 생성하는 코드를 모두 삭제하고 

사용자 데이타베이스 유무를 체크하여

없을 경우 복사하여 사용한다.

// Checking whether file is or not
public boolean isCheckDatabase(){
String filePath = PACKAGE_DIRECTORY + "/databases/" + DATABASE_NAME;
File file = new File(filePath);
if (file.exists()) {
return true;
}
return false;
}
// Copying inside app storage from "/db/xxxx.s3db" in assetspublic void copyDataBase(){
    Log.d("Working", "copyDatabase");    AssetManager manager = mContext.getAssets();    String folderPath = PACKAGE_DIRECTORY + "/databases";    String filePath = PACKAGE_DIRECTORY + "/databases/" + DATABASE_NAME;    File folder = new File(folderPath);    File file = new File(filePath);
    FileOutputStream fileOut = null;    BufferedOutputStream bufferOut = null;    try {
        InputStream inputStr = manager.open("db/" + DATABASE_NAME);        BufferedInputStream bufferStr = new BufferedInputStream(inputStr);
        if (folder.exists()) {
        }else{
            folder.mkdirs();        }


        if (file.exists()) {
            file.delete();            file.createNewFile();        }

        fileOut = new FileOutputStream(file);        bufferOut = new BufferedOutputStream(fileOut);        int read = -1;        byte[] buffer = new byte[1024];        while ((read = bufferStr.read(buffer, 0, 1024)) != -1) {
            bufferOut.write(buffer, 0, read);        }

        bufferOut.flush();
        bufferOut.close();        fileOut.close();        bufferStr.close();        inputStr.close();    } catch (IOException e) {
        Log.e("Error : ", e.getMessage());    }
}

public void onCreate(SQLiteDatabase db) {
    boolean bResult = isCheckDatabase();    // DB가 있는지?    Log.d("Workign", "DataBase Check="+bResult);    if(!bResult){  // DB가 없으면 복사        copyDataBase();    }
}

2016년 6월 12일 일요일

[월간 AJ TED 제 9호] 아이들 칭찬 프로젝트 키즈 피드백 프로그램 업그레이드

1. 앱 제목: 키즈 피드백 2

2. 주소: 

우리 아이들을 많이 칭찬해주세요.

가. 인원 제한없이 아이를 추가할 수 있는 기능이 있어요.

나. 아이별로 동물 캐릭터 선택 및 이름 입력 및 수정 기능이 있어요.

다. 버튼 클릭으로 손쉽게 점수 관리 기능이 있어요.

4라 아이들이 획득한 점수별 아이템 사용 기능이 있어요.