書いてあること
- Kotlinでグリッドビューの中に入れる、カスタムビューを書いてみました。
用意するもの
- Fragment.java
- Adapter.java
- CustomView.java
- fragment_main.xml
- item_fragment.xml
1. Fragment.java
Fragment.java
/**
* 温度調整Fragment画面クラス
*/
class AdjustTempFragment : Fragment() {
/**
* グリッドビュー
*/
private lateinit var gridView: GridView
/**
* なにかしらの情報保持配列
*/
private lateinit var values: Array<HogeEnum>
/**
* グリッドアダプター
*/
private lateinit var gridAdapter: GridAdapter
/**
* コンパニオンオブジェクト
*/
companion object {
/**
* コンテキスト
*/
lateinit var context: Context
/**
* インスタンス生成メソッド
*/
fun createInstance(context: Context): Fragment {
val fragment = Fragment()
this.context = context
return fragment
}
}
/**
* 初期化メソッド
*/
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
super.onCreateView(inflater, container, savedInstanceState)
return inflater.inflate(R.layout.fragment_main, container, false)
}
/**
* メインメソッド
* ・ビューの描画処理
* ・設定画面遷移処理
*/
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
//カスタムビューを描画
this.gridView = view.findViewById(R.id.grid)
this.values = HogeEnum.values()
this.adapter = Adapter(this.context, this.values)
this.gridView.adapter = this.adapter
//設定画面へ遷移
val image: ImageView = view.findViewById(R.id.setting_button)
image.setOnClickListener {
val intent = Intent(activity, SettingActivity::class.java)
startActivity(intent)
}
}
}
2. Adapter.java
Adapter.java
class Adapter : BaseAdapter {
override fun getItemId(p0: Int): Long {
return p0.toLong()
}
/**
* コンテキスト
*/
private lateinit var context: Context
/**
* なにかしらの情報保持配列
*/
private var values: Array<HogeEnum>
/**
* コンストラクタ
*/
constructor(con: Context?) {
if (con != null) {
this.context = con
}
}
/**
* 配列の要素数
*/
override fun getCount(): Int {
return this.values.size
}
/**
* 配列の要素
*/
override fun getItem(p0: Int): Any {
return this.values[p0]
}
/**
* ビュー描画メソッド
*/
override fun getView(p0: Int, p1: View?, p2: ViewGroup?): View {
val itemLayoutView = p1 ?: View.inflate(this.context, R.layout.item_fragment, null)
var viewHolder = itemLayoutView.tag
if (viewHolder == null) {
viewHolder = ViewHolder()
viewHolder.customView = itemLayoutView.custom_view as CustomView
(itemLayoutView.custom_view as CustomView).initView(
this.values[p0].index()
)
itemLayoutView.tag = viewHolder
}
return itemLayoutView
}
}
/**
* ビューホルダークラス
*/
class ViewHolder {
lateinit var customView: CustomView
}
3. CustomView.java
CustomView.java
class CustomView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : LinearLayout(context, attrs, defStyleAttr) {
/**
* 初期化メソッド
*/
@SuppressLint("ResourceAsColor")
fun initView() {
var lp = LayoutParams(200, 200)
var imageView = ImageView(context)
imageView.layoutParams = lp
this.addView(imageView)
}
}
4. fragment_main.xml
fragment_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<GridView
android:id="@+id/grid"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:numColumns="3">
</GridView>
</LinearLayout>
5. item_fragment.xml
item_fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<jp.co.hoge.project.views.CustomView
android:id="@+id/custom_view"
android:layout_width="200dp"
android:layout_height="200dp">
</jp.co.hoge.project.views.CustomView>
</LinearLayout>