Add find visible items for list and flowlayout

This commit is contained in:
pengfei.zhou
2021-10-12 16:33:04 +08:00
committed by osborn
parent 1f511823c5
commit 6cae752456
19 changed files with 172 additions and 138 deletions

View File

@@ -32,7 +32,9 @@ import com.github.pengfeizhou.jscore.JSValue;
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.Callable;
@@ -328,28 +330,56 @@ public class FlowLayoutNode extends SuperNode<RecyclerView> implements IDoricScr
@DoricMethod
public JSONArray findVisibleItems() {
int[] startPos = staggeredGridLayoutManager.findFirstVisibleItemPositions(null);
int[] endPos = staggeredGridLayoutManager.findLastVisibleItemPositions(null);
int[] firstPositions = staggeredGridLayoutManager.findFirstVisibleItemPositions(null);
int[] lastPositions = staggeredGridLayoutManager.findLastVisibleItemPositions(null);
JSONArray jsonArray = new JSONArray();
for (int i = 0; i < staggeredGridLayoutManager.getSpanCount(); i++) {
jsonArray.put(new JSONBuilder()
.put("first", calibratePosition(startPos[i]))
.put("last", calibratePosition(endPos[i]))
.toJSONObject());
int first = firstPositions[0];
for (int firstPosition : firstPositions) {
first = Math.min(first, firstPosition);
}
int last = lastPositions[0];
for (int lastPosition : lastPositions) {
last = Math.max(last, lastPosition);
}
for (int i = first; i <= last; i++) {
jsonArray.put(i);
}
return jsonArray;
}
@DoricMethod
public JSONArray findCompletelyVisibleItems() {
int[] startPos = staggeredGridLayoutManager.findFirstCompletelyVisibleItemPositions(null);
int[] endPos = staggeredGridLayoutManager.findLastCompletelyVisibleItemPositions(null);
JSONArray jsonArray = new JSONArray();
int[] firstPositions = staggeredGridLayoutManager.findFirstVisibleItemPositions(null);
int[] lastPositions = staggeredGridLayoutManager.findLastVisibleItemPositions(null);
Set<Integer> positions = new HashSet<>();
int first = firstPositions[0];
for (int firstPosition : firstPositions) {
first = Math.min(first, firstPosition);
}
int last = lastPositions[0];
for (int lastPosition : lastPositions) {
last = Math.max(last, lastPosition);
}
for (int i = first; i <= last; i++) {
positions.add(i);
}
int[] firstCompletelyVisibleItemPositions = staggeredGridLayoutManager.findFirstCompletelyVisibleItemPositions(null);
int[] lastCompletelyVisibleItemPositions = staggeredGridLayoutManager.findLastCompletelyVisibleItemPositions(null);
for (int i = 0; i < staggeredGridLayoutManager.getSpanCount(); i++) {
jsonArray.put(new JSONBuilder()
.put("first", calibratePosition(startPos[i]))
.put("last", calibratePosition(endPos[i]))
.toJSONObject());
int firstPosition = firstPositions[i];
int firstCompletelyVisibleItemPosition = firstCompletelyVisibleItemPositions[i];
if (firstCompletelyVisibleItemPosition != firstPosition) {
positions.remove(firstPosition);
}
int lastPosition = lastPositions[i];
int lastCompletelyVisibleItemPosition = lastCompletelyVisibleItemPositions[i];
if (lastCompletelyVisibleItemPosition != lastPosition) {
positions.remove(lastPosition);
}
}
JSONArray jsonArray = new JSONArray();
for (int position : positions) {
jsonArray.put(position);
}
return jsonArray;
}

View File

@@ -33,6 +33,7 @@ import com.github.pengfeizhou.jscore.JSONBuilder;
import com.github.pengfeizhou.jscore.JSObject;
import com.github.pengfeizhou.jscore.JSValue;
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.HashSet;
@@ -300,25 +301,29 @@ public class ListNode extends SuperNode<RecyclerView> implements IDoricScrollabl
}
@DoricMethod
public JSONObject findVisibleItems() {
public JSONArray findVisibleItems() {
LinearLayoutManager linearLayoutManager = (LinearLayoutManager) this.mView.getLayoutManager();
assert linearLayoutManager != null;
int startPos = linearLayoutManager.findFirstVisibleItemPosition();
int endPos = linearLayoutManager.findLastVisibleItemPosition();
return new JSONBuilder()
.put("first", calibratePosition(startPos))
.put("last", calibratePosition(endPos)).toJSONObject();
JSONArray jsonArray = new JSONArray();
for (int i = startPos; i <= endPos; i++) {
jsonArray.put(i);
}
return jsonArray;
}
@DoricMethod
public JSONObject findCompletelyVisibleItems() {
public JSONArray findCompletelyVisibleItems() {
LinearLayoutManager linearLayoutManager = (LinearLayoutManager) this.mView.getLayoutManager();
assert linearLayoutManager != null;
int startPos = linearLayoutManager.findFirstCompletelyVisibleItemPosition();
int endPos = linearLayoutManager.findLastCompletelyVisibleItemPosition();
return new JSONBuilder()
.put("first", calibratePosition(startPos))
.put("last", calibratePosition(endPos)).toJSONObject();
JSONArray jsonArray = new JSONArray();
for (int i = startPos; i <= endPos; i++) {
jsonArray.put(i);
}
return jsonArray;
}
private void moveToPosition(int pos, boolean smooth) {