-
Notifications
You must be signed in to change notification settings - Fork 33
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
전남대_Android 신혜서 2주차 과제 Step2 #36
base: main
Are you sure you want to change the base?
Conversation
검색결과가 없다는 문구 visibility로 정리
검색결과가 없다는 문구 visibility로 정리
에뮬 실행 안되는 오류 수정
SearchView로 변경했습니다.
+ NullPointerException 에러해결
+ NullPointerException 에러해결
const val COLUMN_CATEGORY = "category" | ||
} | ||
|
||
class Database(context: Context) : SQLiteOpenHelper(context, "place.db", null, 1) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
용도에 맞도록 클래스 명을 변경해주시면 좋을 것 같아요. PlaceDatabaseOpenHelper 와 같은 느낌으로요!
"CREATE TABLE IF NOT EXISTS ${MapContract.TABLE_CAFE} (" + | ||
"id INTEGER PRIMARY KEY AUTOINCREMENT," + | ||
"${MapContract.COLUMN_NAME} TEXT," + | ||
"${MapContract.COLUMN_ADDRESS} TEXT," + | ||
"${MapContract.COLUMN_CATEGORY} TEXT" + | ||
")" | ||
) | ||
db?.execSQL( | ||
"CREATE TABLE IF NOT EXISTS ${MapContract.TABLE_PHARMACY} (" + | ||
"id INTEGER PRIMARY KEY AUTOINCREMENT," + | ||
"${MapContract.COLUMN_NAME} TEXT," + | ||
"${MapContract.COLUMN_ADDRESS} TEXT," + | ||
"${MapContract.COLUMN_CATEGORY} TEXT" + | ||
")" | ||
) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
👍
private fun queryPlaces( | ||
db: SQLiteDatabase, | ||
tableName: String, | ||
searchText: String | ||
): List<Map<String, String>> { | ||
val cursor: Cursor = db.query( | ||
tableName, | ||
null, | ||
"${MapContract.COLUMN_NAME} LIKE ? OR ${MapContract.COLUMN_ADDRESS} LIKE ?", | ||
arrayOf("%$searchText%", "%$searchText%"), | ||
null, | ||
null, | ||
null | ||
) | ||
|
||
val results = mutableListOf<Map<String, String>>() | ||
while (cursor.moveToNext()) { | ||
val row = mutableMapOf<String, String>() | ||
row[MapContract.COLUMN_NAME] = cursor.getString(cursor.getColumnIndexOrThrow(MapContract.COLUMN_NAME)) | ||
row[MapContract.COLUMN_ADDRESS] = cursor.getString(cursor.getColumnIndexOrThrow(MapContract.COLUMN_ADDRESS)) | ||
row[MapContract.COLUMN_CATEGORY] = cursor.getString(cursor.getColumnIndexOrThrow(MapContract.COLUMN_CATEGORY)) | ||
results.add(row) | ||
} | ||
cursor.close() | ||
return results | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
searchText 가 white space 이거나 empty string 일 경우는 동작하면 안될 것 같아요.
LIKE 검색을 하고 있기 때문에 empty string 인 경우, 즉 "" 인 경우는 모든 결과값을 리턴하게 됩니다.
class SearchItemViewHolder(itemView: View, private val onItemClick: (String) -> Unit) : | ||
RecyclerView.ViewHolder(itemView) { | ||
|
||
private val nameTextView:TextView = itemView.findViewById(R.id.name) | ||
private val addressTextView : TextView = itemView.findViewById(R.id.place) | ||
private val categoryTextView : TextView = itemView.findViewById((R.id.category)) | ||
|
||
fun bind(searchText: String) { | ||
nameTextView.text = MapContract.COLUMN_NAME | ||
addressTextView.text = MapContract.COLUMN_ADDRESS | ||
categoryTextView.text = MapContract.COLUMN_CATEGORY | ||
} | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
SearchItemViewHolder 와 해당 파일은 전혀 관계가 없어보여요. 따로 클래스를 선언해주시면 좋을 것 같아요.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
안드로이드 스튜디오 한국어 설치 결국 실패해서 앱이 정상적으로 돌아가는지 테스트를 못했습니다ㅜ
이번에는 앱이 터지지 않고 정상적으로 작동해서 기뻤습니당
앱을 켜보시면 일단 가로 더미 데이터는 제가 테스트를 하기 위해 만들었고, 세로에 있는 친구들은 검색어를 입력하지도 않았는데 뜨는 것이 보이실 겁니다...ㅜㅜ 왜그런지 저도 잘 모르겠네요... 이 부분에 대한 코드 수정 조언 부탁드립니다!!
이번에는 앱 실행에 성공하셔다니 정말 다행입니다! 고생 정말 많으셨습니다. 다만 MVVM 을 적용하지 못하셨는데, MVVM 이 아니더라도 천천히 함수, 클래스를 나누는 연습을 먼저 해나가면 좋을 것 같아요. 시간이 급박하여 과제를 하더라도, 이후에 과제를 수정해나가면서 발전해나가보죠!
) : RecyclerView.Adapter<SavedSearchAdapter.SavedSearchViewHolder>() { | ||
|
||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SavedSearchViewHolder { | ||
val view = LayoutInflater.from(context).inflate(R.layout.activity_item_view, parent, false) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
context 가 LayoutInflater 를 위해서 사용되는 것으로 보여요. parent 의 context 를 사용한다면 Adapter 가 context 를 파라미터로 받지 않아도 됩니다.
val view = LayoutInflater.from(context).inflate(R.layout.activity_item_view, parent, false) | |
val view = LayoutInflater.from(parent.context).inflate(R.layout.activity_item_view, parent, false) |
|
||
fun updateData(newData: List<String>) { | ||
data = newData | ||
notifyDataSetChanged() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
notifyDataSetChanged 는 성능이 최악입니다. 필요하다면 notifyItemInserted 등의 것을 사용해주시면 좋습니다. 다만 이 notify 류는 데이터의 변화를 감지해야하는데, 굉장히 번거롭습니다. 그럴 때는 ListAdapter 를 써보시면 조흥ㄹ 것 같네요 :)
if (position != RecyclerView.NO_POSITION) { | ||
val updatedData = data.toMutableList() | ||
updatedData.removeAt(position) | ||
data = updatedData.toList() | ||
notifyDataSetChanged() | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
deleteButton 또한 onItemClick 처럼 이벤트로 처리해주시면 좋을 것 같아요. 특히나 ViewHolder 내부에서 notifyDataSetChanged 같은 것들은 처리되지 않는 것이 좋습니다.
[기능 구현 내용]
검색어를 입력하면 검색 결과 목록이 표시된다. (O)
검색 결과 목록은 세로 스크롤이 된다. (O)
입력한 검색어는 X를 눌러서 삭제할 수 있다. (O)
검색 결과 목록에서 하나의 항목을 선택할 수 있다.(O) -> 선택은 되는데 다음 페이지가 없어서 안넘어가져요!
선택된 항목은 검색어 저장 목록에 추가된다. (X)
저장된 검색어 목록은 가로 스크롤이 된다. (O)
저장된 검색어는 X를 눌러서 삭제할 수 있다. (이건 될때도 있고 안될때도 있었습니다..)
저장된 검색어는 앱을 재실행하여도 유지된다. (O)
[프로그래밍 요구 사항]
검색 데이터 저장은 SQLite를 사용한다.
가능한 MVVM 아키텍쳐 패턴을 적용하도록 한다.
[구현 과정]
database.kt파일을 생성하여 데이터베이스 생성 및 관리
SearchRepo에서 데이터 CRUD 작업
SearchViewModel에서 데이터 처리 및 제공
MainActivity에서 데이터 활용
"검색 결과가 없습니다." 단어의 경우 visibility로 처리, 단어와 연관된 database가 없을때 보여짐
RecyclerView를 사용해서 데이터베이스에서 결과를 가져와 표시해줌
더미 데이터 생성(database.kt에 구현)
ItemView를 구상했고, RecyclerView를 활용하여 검색한 내용 구현
검색한 내용을 X표시를 하면 삭제가 되도록하는 기능을 구현했다.
searchView를 통해서 검색 기능을 구현했습니다.
데이터 베이스는 place.db -> 장소 위치 DB, Helper.db 본인이 클릭한 장소 저장 DB로 나누어져 있습니다.
[소감 및 의문점]
안드로이드 스튜디오 한국어 설치 결국 실패해서 앱이 정상적으로 돌아가는지 테스트를 못했습니다ㅜ
이번에는 앱이 터지지 않고 정상적으로 작동해서 기뻤습니당
앱을 켜보시면 일단 가로 더미 데이터는 제가 테스트를 하기 위해 만들었고, 세로에 있는 친구들은 검색어를 입력하지도 않았는데 뜨는 것이 보이실 겁니다...ㅜㅜ 왜그런지 저도 잘 모르겠네요... 이 부분에 대한 코드 수정 조언 부탁드립니다!!
[가동했을 때]