diff --git a/src/android/jar/src/org/qtproject/qt/android/QtAbstractItemModel.java b/src/android/jar/src/org/qtproject/qt/android/QtAbstractItemModel.java index 83c9448c9cb..49205e82840 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtAbstractItemModel.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtAbstractItemModel.java @@ -263,6 +263,27 @@ public abstract class QtAbstractItemModel public void dataChanged(QtModelIndex topLeft, QtModelIndex bottomRight, int[] roles) { jni_dataChanged(topLeft, bottomRight, roles); } + /** + * Interface for a callback to be invoked when the data in an existing item changes. + */ + public interface OnDataChangedListener { + /** + * Called when the data in an existing item changes. + * + * @param topLeft The top-left index of changed items + * @param bottomRight The bottom-right index of changed items + * @param roles Changed roles; Empty array indicates all roles + */ + void onDataChanged(QtModelIndex topLeft, QtModelIndex bottomRight, int[] roles); + } + /** + * Register a callback to be invoked when the data in an existing item changes. + * + * @param listener The data change listener + */ + public void setOnDataChangedListener(OnDataChangedListener listener) { + m_OnDataChangedListener = listener; + } /** * Begins a column insertion operation. @@ -503,6 +524,15 @@ public abstract class QtAbstractItemModel */ protected final void endResetModel() { jni_endResetModel(); } + private void handleDataChanged(QtModelIndex topLeft, QtModelIndex bottomRight, int[] roles) + { + if (m_OnDataChangedListener != null) { + QtNative.runAction(() -> { + if (m_OnDataChangedListener != null) + m_OnDataChangedListener.onDataChanged(topLeft, bottomRight, roles); + }); + } + } private native void jni_beginInsertColumns(QtModelIndex parent, int first, int last); private native void jni_beginInsertRows(QtModelIndex parent, int first, int last); private native boolean jni_beginMoveColumns(QtModelIndex sourceParent, int sourceFirst, @@ -529,6 +559,7 @@ public abstract class QtAbstractItemModel int[] roles); private long m_nativeReference = 0; + private OnDataChangedListener m_OnDataChangedListener; private QtAbstractItemModel(long nativeReference) { m_nativeReference = nativeReference; } private void detachFromNative() { m_nativeReference = 0; } diff --git a/src/corelib/platform/android/qandroiditemmodelproxy.cpp b/src/corelib/platform/android/qandroiditemmodelproxy.cpp index f1877d72792..f17d417b1f1 100644 --- a/src/corelib/platform/android/qandroiditemmodelproxy.cpp +++ b/src/corelib/platform/android/qandroiditemmodelproxy.cpp @@ -160,6 +160,19 @@ QAndroidItemModelProxy::createNativeProxy(QJniObject itemModel) if (proxy) proxy->jInstance.callMethod("detachFromNative"); }); + + connect(nativeProxy, &QAndroidItemModelProxy::dataChanged, nativeProxy, + [nativeProxy](const QModelIndex &topLeft, const QModelIndex &bottomRight, + const QList &roles) { + auto proxy = qobject_cast(nativeProxy); + if (proxy) { + QJniObject jInstance = proxy->jInstance; + jInstance.callMethod("handleDataChanged", + QAndroidModelIndexProxy::jInstance(topLeft), + QAndroidModelIndexProxy::jInstance(bottomRight), + QJniArray(roles)); + } + }); } return nativeProxy; }