From b9b28619dd5f641ea2c0c561ceaba0fcefa4dba6 Mon Sep 17 00:00:00 2001 From: Julian Winkler Date: Sat, 17 Feb 2024 15:26:59 +0100 Subject: [PATCH] AdapterView: implement setAdapter / getAdapter() properly --- .../generated_headers/android_widget_AbsListView.h | 8 ++++---- src/api-impl-jni/widgets/android_widget_AbsListView.c | 8 ++++++-- src/api-impl/android/widget/AbsListView.java | 10 +++++++++- src/api-impl/android/widget/AdapterView.java | 9 ++++++++- src/api-impl/android/widget/BaseAdapter.java | 2 +- src/api-impl/android/widget/Spinner.java | 4 ++++ 6 files changed, 32 insertions(+), 9 deletions(-) diff --git a/src/api-impl-jni/generated_headers/android_widget_AbsListView.h b/src/api-impl-jni/generated_headers/android_widget_AbsListView.h index 6ab8447d..5643f12c 100644 --- a/src/api-impl-jni/generated_headers/android_widget_AbsListView.h +++ b/src/api-impl-jni/generated_headers/android_widget_AbsListView.h @@ -209,11 +209,11 @@ JNIEXPORT jlong JNICALL Java_android_widget_AbsListView_native_1constructor /* * Class: android_widget_AbsListView - * Method: setAdapter - * Signature: (Landroid/widget/ListAdapter;)V + * Method: native_setAdapter + * Signature: (JLandroid/widget/ListAdapter;)V */ -JNIEXPORT void JNICALL Java_android_widget_AbsListView_setAdapter - (JNIEnv *, jobject, jobject); +JNIEXPORT void JNICALL Java_android_widget_AbsListView_native_1setAdapter + (JNIEnv *, jobject, jlong, jobject); /* * Class: android_widget_AbsListView diff --git a/src/api-impl-jni/widgets/android_widget_AbsListView.c b/src/api-impl-jni/widgets/android_widget_AbsListView.c index cb146ace..785c1624 100644 --- a/src/api-impl-jni/widgets/android_widget_AbsListView.c +++ b/src/api-impl-jni/widgets/android_widget_AbsListView.c @@ -104,10 +104,14 @@ JNIEXPORT jlong JNICALL Java_android_widget_AbsListView_native_1constructor(JNIE return _INTPTR(scrolled_window); } -JNIEXPORT void JNICALL Java_android_widget_AbsListView_setAdapter(JNIEnv *env, jobject this, jobject adapter) +JNIEXPORT void JNICALL Java_android_widget_AbsListView_native_1setAdapter(JNIEnv *env, jobject this, jlong widget_ptr, jobject adapter) { - GtkScrolledWindow *scrolled_window = GTK_SCROLLED_WINDOW(_PTR(_GET_LONG_FIELD(this, "widget"))); + GtkScrolledWindow *scrolled_window = GTK_SCROLLED_WINDOW(_PTR(widget_ptr)); GtkListView *list_view = GTK_LIST_VIEW(gtk_scrolled_window_get_child(scrolled_window)); + if (!adapter) { + gtk_list_view_set_model(list_view, NULL); + return; + } RangeListModel *model = g_object_new(range_list_model_get_type(), NULL); model->list_view = list_view; model->jobject = _REF(this); diff --git a/src/api-impl/android/widget/AbsListView.java b/src/api-impl/android/widget/AbsListView.java index a05974b4..975d562c 100644 --- a/src/api-impl/android/widget/AbsListView.java +++ b/src/api-impl/android/widget/AbsListView.java @@ -17,12 +17,16 @@ public abstract class AbsListView extends AdapterView { @Override protected native long native_constructor(Context context, AttributeSet attrs); + protected native void native_setAdapter(long widget, ListAdapter adapter); public void setChoiceMode(int choiceMode) {} public void setOnScrollListener(OnScrollListener onScrollListener) {} - public native void setAdapter(ListAdapter adapter); + public void setAdapter(ListAdapter adapter) { + super.setAdapter(adapter); + native_setAdapter(this.widget, adapter); + } public native void setItemChecked(int position, boolean value); @@ -37,6 +41,10 @@ public abstract class AbsListView extends AdapterView { public int getListPaddingBottom() {return 0;} + public ListAdapter getAdapter() { + return (ListAdapter) super.getAdapter(); + } + public int pointToPosition(int x, int y) { return -1; } diff --git a/src/api-impl/android/widget/AdapterView.java b/src/api-impl/android/widget/AdapterView.java index aa9fb202..08192865 100644 --- a/src/api-impl/android/widget/AdapterView.java +++ b/src/api-impl/android/widget/AdapterView.java @@ -7,6 +7,8 @@ import android.view.ViewGroup; public abstract class AdapterView extends ViewGroup { + private Adapter adapter; + public AdapterView(Context context) { super(context); } @@ -22,7 +24,8 @@ public abstract class AdapterView extends ViewGroup { public void onItemClick(AdapterView parent, View view, int position, long id); } - public void setAdapter(SpinnerAdapter adapter) { + public void setAdapter(Adapter adapter) { + this.adapter = adapter; } public void setSelection(int i) { @@ -33,4 +36,8 @@ public abstract class AdapterView extends ViewGroup { public void setOnItemClickListener(AdapterView.OnItemClickListener listener) {} public void setSelection(int position, boolean animate) {} + + public Adapter getAdapter() { + return adapter; + } } diff --git a/src/api-impl/android/widget/BaseAdapter.java b/src/api-impl/android/widget/BaseAdapter.java index 837f0a36..a3e6951b 100644 --- a/src/api-impl/android/widget/BaseAdapter.java +++ b/src/api-impl/android/widget/BaseAdapter.java @@ -27,7 +27,7 @@ import android.view.ViewGroup; * {@link ListAdapter} interface} and {@link Spinner} (by implementing the * specialized {@link SpinnerAdapter} interface. */ -public abstract class BaseAdapter implements /*ListAdapter,*/ SpinnerAdapter { +public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter { private final DataSetObservable mDataSetObservable = new DataSetObservable(); public boolean hasStableIds() { return false; diff --git a/src/api-impl/android/widget/Spinner.java b/src/api-impl/android/widget/Spinner.java index 2069adaf..e157cc28 100644 --- a/src/api-impl/android/widget/Spinner.java +++ b/src/api-impl/android/widget/Spinner.java @@ -13,4 +13,8 @@ public class Spinner extends AbsSpinner { super(context, attributeSet); } + public void setAdapter(SpinnerAdapter adapter) { + super.setAdapter(adapter); + } + } \ No newline at end of file