Skip to content

Commit e5164a6

Browse files
committed
Add RecyclerViewAdapter
1 parent 4bbe464 commit e5164a6

File tree

2 files changed

+134
-0
lines changed

2 files changed

+134
-0
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.pureswift.swiftandroid
2+
3+
import android.view.View
4+
import android.view.ViewGroup
5+
import androidx.recyclerview.widget.RecyclerView
6+
import androidx.recyclerview.widget.RecyclerView.ViewHolder
7+
8+
class RecyclerViewAdapter(val swiftObject: SwiftObject) :
9+
RecyclerView.Adapter<ViewHolder>() {
10+
11+
class ViewHolder(val view: View, val swiftObject: SwiftObject) : RecyclerView.ViewHolder(view) {
12+
13+
}
14+
15+
// Create new views (invoked by the layout manager)
16+
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerViewAdapter.ViewHolder {
17+
return onCreateViewHolderSwift(parent, viewType)
18+
}
19+
20+
external fun onCreateViewHolderSwift(parent: ViewGroup, viewType: Int): RecyclerViewAdapter.ViewHolder
21+
22+
// Replace the contents of a view (invoked by the layout manager)
23+
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
24+
onBindViewHolderSwift(holder, position)
25+
}
26+
27+
external fun onBindViewHolderSwift(holder: RecyclerView.ViewHolder, position: Int)
28+
29+
// Return the size of your dataset (invoked by the layout manager)
30+
override fun getItemCount(): Int {
31+
return getItemCountSwift()
32+
}
33+
34+
external fun getItemCountSwift(): Int
35+
}
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
//
2+
// RecyclerView.swift
3+
// SwiftAndroidApp
4+
//
5+
// Created by Alsey Coleman Miller on 6/13/25.
6+
//
7+
8+
import AndroidKit
9+
10+
@JavaClass("com.pureswift.swiftandroid.RecyclerViewAdapter")
11+
open class RecyclerViewAdapter: RecyclerView.Adapter<RecyclerView.ViewHolder> {
12+
13+
@JavaMethod
14+
@_nonoverride public convenience init(swiftObject: SwiftObject?, environment: JNIEnvironment? = nil)
15+
16+
@JavaMethod
17+
func getSwiftObject() -> SwiftObject!
18+
}
19+
20+
@JavaImplementation("com.pureswift.swiftandroid.RecyclerViewAdapter")
21+
extension RecyclerViewAdapter {
22+
23+
@JavaMethod
24+
public func onCreateViewHolderSwift(_ viewGroup: ViewGroup?, _ viewType: Int32) -> RecyclerView.ViewHolder! {
25+
callback.onCreateViewHolder(viewGroup, viewType)
26+
}
27+
28+
@JavaMethod
29+
public func onBindViewHolderSwift(_ viewHolder: RecyclerView.ViewHolder?, _ position: Int32) {
30+
callback.onBindViewHolder(viewHolder, position)
31+
}
32+
33+
@JavaMethod
34+
public func getItemCountSwift() -> Int32 {
35+
callback.getItemCount()
36+
}
37+
}
38+
39+
public extension RecyclerViewAdapter {
40+
41+
struct Callback<T> {
42+
43+
var onCreateViewHolder: ((ViewGroup, Int32) -> RecyclerView.ViewHolder)?
44+
45+
var onBindViewHolder: ((RecyclerViewAdapter.ViewHolder<T>, Int32) -> ())?
46+
47+
var getItemCount: () -> Int32 = { return 0 }
48+
49+
public init(onCreateViewHolder: ((ViewGroup, Int32) -> RecyclerView.ViewHolder)? = nil, onBindViewHolder: ((RecyclerView.ViewHolder, Int32) -> Void)? = nil, getItemCount: @escaping () -> Int32) {
50+
self.onCreateViewHolder = onCreateViewHolder
51+
self.onBindViewHolder = onBindViewHolder
52+
self.getItemCount = getItemCount
53+
}
54+
}
55+
56+
convenience init(_ callback: Callback, environment: JNIEnvironment? = nil) {
57+
let swiftObject = SwiftObject(callback, environment: environment)
58+
self.init(swiftObject: swiftObject, environment: environment)
59+
}
60+
61+
var callback: Callback<T> {
62+
get {
63+
getSwiftObject().valueObject().value as! Callback
64+
}
65+
set {
66+
getSwiftObject().valueObject().value = newValue
67+
}
68+
}
69+
}
70+
71+
extension RecyclerViewAdapter {
72+
73+
@JavaClass("com.pureswift.swiftandroid.RecyclerViewAdapter$ViewHolder")
74+
open class ViewHolder<T>: RecyclerView.ViewHolder {
75+
76+
@JavaMethod
77+
@_nonoverride public convenience init(view: AndroidView.View?, swiftObject: SwiftObject?, environment: JNIEnvironment? = nil)
78+
79+
@JavaMethod
80+
func getSwiftObject() -> SwiftObject!
81+
}
82+
}
83+
84+
public extension RecyclerViewAdapter.ViewHolder {
85+
86+
convenience init(_ value: T, view: AndroidView.View?, environment: JNIEnvironment? = nil) {
87+
let swiftObject = SwiftObject(value, environment: environment)
88+
self.init(view: view, swiftObject: swiftObject, environment: environment)
89+
}
90+
91+
var value: T {
92+
get {
93+
getSwiftObject().valueObject().value as! T
94+
}
95+
set {
96+
getSwiftObject().valueObject().value = newValue
97+
}
98+
}
99+
}

0 commit comments

Comments
 (0)