Skip to content

Commit 04b298a

Browse files
committed
Add list_view.py
1 parent c4e2639 commit 04b298a

File tree

3 files changed

+74
-4
lines changed

3 files changed

+74
-4
lines changed

apps/android_pythonnative_3/app/src/main/python/app/main_3.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,9 @@ def __init__(self, native_instance):
88
def on_create(self):
99
super().on_create()
1010
stack_view = pn.StackView(self.native_instance)
11-
button = pn.Button(self.native_instance, "Button")
12-
label = pn.Label(self.native_instance, "Label")
13-
stack_view.add_view(button)
14-
stack_view.add_view(label)
11+
list_data = ["item_{}".format(i) for i in range(100)]
12+
list_view = pn.ListView(self.native_instance, list_data)
13+
stack_view.add_view(list_view)
1514
self.set_root_view(stack_view)
1615

1716
def on_start(self):

libs/pythonnative/pythonnative/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from .date_picker import DatePicker
44
from .image_view import ImageView
55
from .label import Label
6+
from .list_view import ListView
67
from .material_activity_inidicator_view import MaterialActivityIndicatorView
78
from .material_button import MaterialButton
89
from .material_date_picker import MaterialDatePicker
@@ -27,6 +28,7 @@
2728
"DatePicker",
2829
"ImageView",
2930
"Label",
31+
"ListView",
3032
"MaterialActivityIndicatorView",
3133
"MaterialButton",
3234
"MaterialDatePicker",
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
from abc import ABC, abstractmethod
2+
from .utils import IS_ANDROID
3+
from .view import ViewBase
4+
5+
# ========================================
6+
# Base class
7+
# ========================================
8+
9+
10+
class ListViewBase(ABC):
11+
@abstractmethod
12+
def __init__(self) -> None:
13+
super().__init__()
14+
15+
@abstractmethod
16+
def set_data(self, data: list) -> None:
17+
pass
18+
19+
@abstractmethod
20+
def get_data(self) -> list:
21+
pass
22+
23+
24+
if IS_ANDROID:
25+
# ========================================
26+
# Android class
27+
# ========================================
28+
29+
from java import jclass
30+
31+
class ListView(ListViewBase, ViewBase):
32+
def __init__(self, context, data: list = []) -> None:
33+
super().__init__()
34+
self.context = context
35+
self.native_class = jclass("android.widget.ListView")
36+
self.native_instance = self.native_class(context)
37+
self.set_data(data)
38+
39+
def set_data(self, data: list) -> None:
40+
adapter = jclass("android.widget.ArrayAdapter")(
41+
self.context, jclass("android.R$layout").simple_list_item_1, data
42+
)
43+
self.native_instance.setAdapter(adapter)
44+
45+
def get_data(self) -> list:
46+
adapter = self.native_instance.getAdapter()
47+
return [adapter.getItem(i) for i in range(adapter.getCount())]
48+
49+
else:
50+
# ========================================
51+
# iOS class
52+
# ========================================
53+
54+
from rubicon.objc import ObjCClass
55+
56+
class ListView(ListViewBase, ViewBase):
57+
def __init__(self, data: list = []) -> None:
58+
super().__init__()
59+
self.native_class = ObjCClass("UITableView")
60+
self.native_instance = self.native_class.alloc().init()
61+
self.set_data(data)
62+
63+
def set_data(self, data: list) -> None:
64+
# Note: This is a simplified representation. Normally, you would need to create a UITableViewDataSource.
65+
self.native_instance.reloadData()
66+
67+
def get_data(self) -> list:
68+
# Note: This is a simplified representation. Normally, you would need to get data from the UITableViewDataSource.
69+
return []

0 commit comments

Comments
 (0)