* DB 연결 참조
[Android Studio/Kotlin]MS-SQL DB를 안드로이드 스튜디오와 연결하기
MSSQL DB 구축이 되었다는 가정 하에 MSSQL과 안드로이드 스튜디오를 연결해보겠다. 1. DB 연결 데이터를 담을 변수 선언 var ip: String? = "211.187.2.242" // 서버 ip 주소 val port = "port번호" // port번호..
anovice-dp.tistory.com
1. Fragment 내 RecyclerView 생성
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".fragment._____">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#F0F0F0" />
</LinearLayout>
2. 리사이클러뷰 내에 들어갈 아이템 xml 만들어주기
* layout 폴더 마우스 우클릭 > layout resource file 선택 > 해당 파일 생성
<?xml version="1.0" encoding="utf-8"?>
<!--fragment_home.xml 내 리사이클러뷰 상세 레이아웃-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp"
android:gravity="center_vertical"
android:layout_marginBottom="8dp"
android:background="@android:color/white">
<!--상품 이미지-->
<ImageView
android:id="@+id/img_Image"
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@mipmap/ic_launcher"
android:contentDescription="TODO" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/txt_Title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:includeFontPadding="false"
android:text="TITLE"
android:textSize="24sp"
android:textColor="@android:color/black"
android:textStyle="bold"/>
<TextView
android:id="@+id/txt_Category"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:includeFontPadding="false"
android:text="categori"
android:textSize="15sp"
android:textColor="@android:color/darker_gray"/>
</LinearLayout>
</LinearLayout>
3. 데이터를 관리해주는 데이터 모델 클래스 생성
data class rcv_data_list(var data1: Int,
val data2: String,
val data3: String)
4. DB에서 데이터를 긁어와 위 데이터 모델에 추가
var data_list = ArrayList<rcv_data_list>() // DB 데이터를 담을 배열
fun DisplayListView(qry: String?) {
if (connection != null) {
var statement: Statement? = null
statement = connection!!.createStatement()
//쿼리문을 이용해 가져올 데이터값을 정한다.
val resultSet: ResultSet = statement.executeQuery(qry)
while (resultSet.next()) {
data_list.add(rcv_data_list(R.drawable.img_home
, resultSet.getString(1) // db 배열의 첫번째 값
, resultSet.getString(2))) // db 배열의 두번째 값
}
} else {
Log.d(GlobalVar.TAG, "연결 없음 실패")
Toast.makeText(GlobalVar.main_context, "연결 없음 실패", Toast.LENGTH_LONG).show()
}
}
* 앞서 생성한 데이터 모델 rcv_data_list의 형태를 갖는 데이터 리스트 data_list 생성
-> 이 배열에 DB 데이터를 담을 예정
* 나중에 함수를 호출할 때 직접 select 쿼리를 넣어줌으로써 데이터 값을 가져옴
* DB 데이터를 처음부터 끝까지 읽으면서 해당 값들을 data_list 배열에 add 해줌
5. RecyclerView를 연결하기 위한 Adapter 생성
class RecyclerViewAdapter(val list: ArrayList<rcv_data_list>) : RecyclerView.Adapter<RecyclerViewHolder>() {
// onCreateViewHolder() - 아이템 뷰를 위한 뷰홀더 객체 생성하여 리턴
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.recyclerview, parent, false)
return HomeFragment_RecyclerViewHolder(view)
}
// getItemCount() - 전체 데이터 갯수 리턴
override fun getItemCount(): Int {
return list.size
}
// onBindViewHolder() - position에 해당하는 데이터를 뷰홀더의 아이템뷰에 표시
override fun onBindViewHolder(holder: HomeFragment_RecyclerViewHolder, position: Int) {
holder.holder_data2.text = list.get(position).data2
holder.holder_data3.text = list.get(position).data3
// 아이템 클릭 이벤트
holder.itemView.setOnClickListener {
// 클릭 시 행동
}
}
}
* 앞서 DB 데이터를 저장한 배열 data_list을 매개변수로 받아와 사용
* onBindViewHolder에서는 선택된 view의 값을 6번에서 생성할 ViewHolder를 통해 가져온다.
* ViewHolder의 holder의 itemView가 클릭됨 = RecyclerView 내 아이템이 클림됨
6. RecyclerView의 layout_item과 연결되는 ViewHolder 생성
class HomeFragment_RecyclerViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) {
val holder_data1 = itemView.findViewById<ImageView>(R.id.img_Image)
val holder_data2 = itemView.findViewById<TextView>(R.id.txt_Title)
val holder_data3 = itemView.findViewById<TextView>(R.id.txt_Category)
}
* RecyclerView의 Item에 들어있는 값들을 각각 변수에 저장 후 5번 Adapter에서 사용
7. Fragment 내에서 위 DB select 함수를 호출하고, 리사이클러뷰와 연결함
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
try {
// db 테이블 내 전체 컬럼 호출 후 데이터 배열 저장
Main_DBConnection.DisplayPrdListView("SELECT * FROM 테이블명")
RecyclerView.layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
RecyclerView.setHasFixedSize(true)
RecyclerView.adapter = RecyclerViewAdapter(data_list)
} catch (e: SQLException) {
e.printStackTrace()
}
}
7-1) 리사이클러뷰는 LinearLayoutManager를 통해 4가지 형태로 만들 수 있다.
* 세로 레이아웃 : 세로 스크롤이 가능 -> LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
* 가로 레이아웃 : 가로 스크롤이 가능 -> LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)
* 불규칙 레이아웃 : 아이템의 높이에 따라 불규칙 적으로 타일 배치
* 그리드 레이아웃 : 타일 느낌의 뷰를 생성할 수 있음
7-2) RecyclerView.setHasFixedSize(true)의 의미
* 아이템 항목을 추가할 때마다 리사이클러뷰의 크기는 변경
> 레이아웃을 그릴 때, 크기를 측정하고 다시 그리는 것을 반복
> setHasFixedSize는 크기 변경이 일정하다는 것을 사용자의 입력으로 확인
: 항목의 높이나 너비가 변경되지 않으며, 추가 또는 제거된 모든 항목은 동일
'Android > UI-UX 디자인' 카테고리의 다른 글
[Android/Layout]리사이클러뷰 내 Swipe 기능으로 리스트 새로고침 (0) | 2021.05.16 |
---|---|
[Android/Basic]설정화면 구현하기 (0) | 2021.05.12 |
[Android/Layout]Fragment에서 버튼을 생성하여 버튼 클릭 시 Activity로 intent하기 (0) | 2021.05.08 |
[Android/Layout]BottomNavigationView와 ViewPager2를 이용한 화면 구축 (0) | 2021.05.08 |
[Android/Layout]ListView Search 기능 만들기 (0) | 2021.02.08 |