[Android/Layout]DB 데이터를 Fragment 내 RecyclerView에 뿌리기(MS-SQL)

2021. 5. 8. 06:06Android/UI-UX 디자인

728x90
반응형

* 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는 크기 변경이 일정하다는 것을 사용자의 입력으로 확인

       : 항목의 높이나 너비가 변경되지 않으며, 추가 또는 제거된 모든 항목은 동일

728x90
반응형