Skip to content

Commit 868f82e

Browse files
committed
fix(android): refreshVisibleItems fix to refresh all necessary views
1 parent e03f1d8 commit 868f82e

File tree

4 files changed

+26
-7
lines changed

4 files changed

+26
-7
lines changed

packages/collectionview/platforms/android/java/com/nativescript/collectionview/Adapter.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,14 @@ public CollectionViewCellHolder onCreateViewHolder(@NonNull ViewGroup parent, in
2424
return null;
2525
}
2626

27+
@NonNull
28+
@Override
29+
public void onViewRecycled(@NonNull CollectionViewCellHolder holder) {
30+
if (this.adapterInterface != null) {
31+
this.adapterInterface.onViewRecycled(holder);
32+
}
33+
}
34+
2735
@Override
2836
public void onBindViewHolder(@NonNull CollectionViewCellHolder holder, int position) {
2937
if (this.adapterInterface != null) {
@@ -38,6 +46,7 @@ public int getItemCount() {
3846
}
3947
return 0;
4048
}
49+
4150
@Override
4251
public int getItemViewType(int position) {
4352
if (this.adapterInterface != null) {

packages/collectionview/platforms/android/java/com/nativescript/collectionview/AdapterInterface.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ public interface AdapterInterface {
99

1010
void onBindViewHolder(@NonNull CollectionViewCellHolder holder, int position);
1111

12+
void onViewRecycled(@NonNull CollectionViewCellHolder holder);
13+
1214
int getItemViewType(int position);
15+
1316
long getItemId(int position);
1417

1518
int getItemCount();

src/collectionview/collectionview.android.ts

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -790,12 +790,11 @@ export class CollectionView extends CollectionViewBase {
790790
if (!view) {
791791
return;
792792
}
793-
const layoutManager = this.layoutManager as androidx.recyclerview.widget.LinearLayoutManager;
794-
if (layoutManager['findFirstVisibleItemPosition']) {
795-
const first = layoutManager.findFirstVisibleItemPosition();
796-
const last = layoutManager.findLastVisibleItemPosition();
797-
this._listViewAdapter.notifyItemRangeChanged(first, last - first + 1);
798-
}
793+
const ids = this._viewHolders
794+
.map((s) => s['position'])
795+
.filter((s) => s !== null)
796+
.sort((a, b) => a - b);
797+
this._listViewAdapter.notifyItemRangeChanged(ids[0], ids[ids.length - 1] - ids[0] + 1);
799798
}
800799
public isItemAtIndexVisible(index: number): boolean {
801800
const view = this.nativeViewProtected;
@@ -898,7 +897,8 @@ export class CollectionView extends CollectionViewBase {
898897
getItemViewType: this.getItemViewType.bind(this),
899898
getItemCount: this.getItemCount.bind(this),
900899
onCreateViewHolder: this.onCreateViewHolder.bind(this),
901-
onBindViewHolder: this.onBindViewHolder.bind(this)
900+
onBindViewHolder: this.onBindViewHolder.bind(this),
901+
onViewRecycled: this.onViewRecycled.bind(this)
902902
});
903903
// const composedAdapter = new com.h6ah4i.android.widget.advrecyclerview.composedadapter.ComposedAdapter();
904904
// composedAdapter.addAdapter(new CollectionViewAdapter(new WeakRef(this)));
@@ -1023,6 +1023,7 @@ export class CollectionView extends CollectionViewBase {
10231023
let view = holder.view;
10241024
const bindingContext = this._prepareItem(view, position);
10251025
const isNonSync = holder['defaultItemView'] === true;
1026+
holder['position'] = position;
10261027

10271028
view = isNonSync ? (view as ContentView).content : view;
10281029

@@ -1070,6 +1071,10 @@ export class CollectionView extends CollectionViewBase {
10701071
CLog(CLogTypes.log, 'onBindViewHolder done ', position);
10711072
}
10721073
}
1074+
1075+
onViewRecycled(holder) {
1076+
holder['position'] = null;
1077+
}
10731078
}
10741079

10751080
interface CollectionViewCellHolder extends com.nativescript.collectionview.CollectionViewCellHolder {

src/collectionview/typings/arv.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,14 @@ declare module com {
2020
public getItemCount(): number;
2121
public getItemId(param0: number): number;
2222
public onBindViewHolder(param0: CollectionViewCellHolder, param1: number): void;
23+
public onViewRecycled(param0: CollectionViewCellHolder): void;
2324
constructor(implementation?: {
2425
onCreateViewHolder(param0: globalAndroid.view.ViewGroup, param1: number): CollectionViewCellHolder;
2526
getItemViewType(param0: number): number;
2627
getItemCount(): number;
2728
getItemId(param0: number): number;
2829
onBindViewHolder(param0: CollectionViewCellHolder, param1: number): void;
30+
onViewRecycled(param0: CollectionViewCellHolder): void;
2931
});
3032
}
3133
export class Adapter extends androidx.recyclerview.widget.RecyclerView.Adapter<CollectionViewCellHolder> {

0 commit comments

Comments
 (0)