Skip to content

Commit 64765d6

Browse files
committed
Progress point -- Scrolling by balancing the buffers (one sided) almost working
1 parent 33730a8 commit 64765d6

5 files changed

Lines changed: 199 additions & 308 deletions

File tree

AndroidFilePickerLightLibrary/src/main/java/com/maxieds/androidfilepickerlightlibrary/DisplayAdapters.java

Lines changed: 39 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -45,33 +45,35 @@ public static class FileListAdapter extends RecyclerView.Adapter<BaseViewHolder>
4545
public FileListAdapter(List<String> nextFileListData, List<DisplayTypes.FileType> nextFileItemsData) {
4646
this.fileListData = new ArrayList<String>();
4747
this.fileItemsData = new ArrayList<DisplayTypes.FileType>();
48-
this.setHasStableIds(false); // ???
48+
this.setHasStableIds(true);
4949
reloadDataSets(nextFileListData, nextFileItemsData, false);
5050
}
5151

5252
public void reloadDataSets(List<String> nextDataSet, List<DisplayTypes.FileType> nextFileItemsData, boolean notifyAdapter) {
53-
Log.i(LOGTAG, "PREV SIZE = " + fileListData.size() + ", " + nextDataSet.size());
5453
if(fileListData != nextDataSet) {
5554
fileListData.clear();
5655
fileListData.addAll(nextDataSet);
57-
//fileListData = nextDataSet;
5856
}
5957
if(fileItemsData != nextFileItemsData) {
6058
fileItemsData.clear();
6159
fileItemsData.addAll(nextFileItemsData);
62-
//fileItemsData = nextFileItemsData;
6360
}
6461
if(notifyAdapter) {
6562
notifyDataSetChanged();
66-
//notifyItemRangeInserted(0, nextDataSet.size());
6763
}
68-
Log.i(LOGTAG, "POST SIZE = " + fileListData.size());
6964
}
7065

7166
public void reloadDataSets(List<String> nextDataSet, List<DisplayTypes.FileType> nextFileItemsData) {
7267
reloadDataSets(nextDataSet, nextFileItemsData, true);
7368
}
7469

70+
public DisplayTypes.FileType getFileItemByIndex(int indexPos) {
71+
if(indexPos < 0 || indexPos >= fileItemsData.size()) {
72+
return null;
73+
}
74+
return fileItemsData.get(indexPos);
75+
}
76+
7577
private static final int VIEW_TYPE_FILE_ITEM = 0;
7678

7779
@Override
@@ -83,29 +85,30 @@ public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
8385

8486
@Override
8587
public void onBindViewHolder(BaseViewHolder bvHolder, int posIndex) {
86-
bvHolder.getDisplayText().setText(fileListData.get(posIndex));
87-
//Log.i(LOGTAG, String.format(Locale.getDefault(), "onBindViewHolder @ %d -- %s", posIndex, bvHolder.getDisplayText().getText()));
88+
bvHolder.setInitialIndexPosition(posIndex);
8889
if(!fileItemsData.isEmpty()) {
8990
DisplayTypes.FileType fileItem = fileItemsData.get(posIndex);
9091
fileItem.setLayoutContainer(bvHolder.getMainViewLayoutContainer());
9192
View viewItemContainer = bvHolder.getMainViewLayoutContainer();
9293
DisplayFragments.FileListItemFragment.resetLayout(viewItemContainer, fileItem, posIndex);
93-
}
94+
}
95+
//Log.i(LOGTAG, String.format(Locale.getDefault(), "onBindViewHolder @ %d -- %s (ADAPTER -> %s) [DATA ITEMS SIZE = %d]", posIndex,
96+
// bvHolder.getDisplayText().getText(), fileListData.get(posIndex), fileItemsData.size()));
9497
}
9598

9699
@Override
97100
public void onViewRecycled(BaseViewHolder bvHolder) {
98-
//Log.i(LOGTAG,"onViewRecycled: " + bvHolder);
101+
//Log.i(LOGTAG,"onViewRecycled: " + bvHolder + " AT initial INDEX " + bvHolder.getInitialIndexPosition());
99102
}
100103

101104
@Override
102105
public void onViewDetachedFromWindow(BaseViewHolder bvHolder) {
103-
//Log.i(LOGTAG,"onViewDetachedFromWindow: " + bvHolder);
106+
//Log.i(LOGTAG,"onViewDetachedFromWindow: " + bvHolder + " AT initial INDEX " + bvHolder.getInitialIndexPosition());
104107
}
105108

106109
@Override
107110
public void onViewAttachedToWindow(BaseViewHolder bvHolder) {
108-
//Log.i(LOGTAG,"onViewAttachedToWindow: " + bvHolder);
111+
//Log.i(LOGTAG,"onViewAttachedToWindow: " + bvHolder + " AT initial INDEX " + bvHolder.getInitialIndexPosition());
109112
}
110113

111114
@Override
@@ -115,19 +118,12 @@ public int getItemCount() {
115118

116119
@Override
117120
public long getItemId(int posIndex) {
118-
if(fileItemsData.size() > posIndex && fileItemsData.get(posIndex).getLayoutContainer() != null){
119-
return fileItemsData.get(posIndex).getLayoutContainer().hashCode();
120-
}
121-
else if(fileItemsData.size() > posIndex) {
122-
return fileItemsData.get(posIndex).hashCode();
123-
}
124121
return posIndex;
125122
}
126123

127124
@Override
128125
public int getItemViewType(int posIndex) {
129-
//return posIndex;
130-
return VIEW_TYPE_FILE_ITEM;
126+
return posIndex;
131127
}
132128

133129
}
@@ -164,15 +160,34 @@ public BaseViewHolder(View v) {
164160
v.setOnLongClickListener(this);
165161
displayText = (TextView) v.findViewById(R.id.fileEntryBaseName);
166162
initIndexPos = -1;
167-
//setIsRecyclable(false); // ???
163+
168164
}
169165

170166
public TextView getDisplayText() { return displayText; }
167+
public void setDisplayText(TextView nextDisplayText) { displayText = nextDisplayText; }
171168

172169
public int getInitialIndexPosition() { return initIndexPos; }
170+
public void setInitialIndexPosition(int initIdx) { initIndexPos = initIdx; }
173171

174172
public View getMainViewLayoutContainer() { return fileItemContainerView; }
175173

174+
private static int getPositionForView(View v) {
175+
DisplayFragments displayCtx = DisplayFragments.getInstance();
176+
FileChooserRecyclerView mainRV = displayCtx.getMainRecyclerView();
177+
BaseViewHolder bvHolder = (BaseViewHolder) mainRV.getChildViewHolder(v);
178+
if(bvHolder == null) {
179+
return -1;
180+
}
181+
return bvHolder.getInitialIndexPosition();
182+
}
183+
184+
public static DisplayTypes.FileType getFileItemForView(View v) {
185+
DisplayFragments displayCtx = DisplayFragments.getInstance();
186+
FileChooserRecyclerView mainRV = displayCtx.getMainRecyclerView();
187+
DisplayAdapters.FileListAdapter rvAdapter = (DisplayAdapters.FileListAdapter) mainRV.getAdapter();
188+
return rvAdapter.getFileItemByIndex(getPositionForView(v));
189+
}
190+
176191
@Override
177192
public void onClick(View v) {
178193
Log.i(LOGTAG, "BaseViewHolder::onClick [RETURNING, DOING NOTHING] ... ");
@@ -181,17 +196,14 @@ public void onClick(View v) {
181196
@Override
182197
public boolean onLongClick(View v) {
183198
Log.i(LOGTAG, "BaseViewHolder::onLongClick");
184-
int fileItemPosIndex = DisplayFragments.getInstance().findFileItemIndexByLayout(v);
185-
if(fileItemPosIndex < 0) {
186-
return false;
187-
}
188-
DisplayTypes.FileType fileItem = DisplayFragments.getInstance().activeFileItemsDataList.get(fileItemPosIndex);
199+
DisplayTypes.FileType fileItem = getFileItemForView(v);
189200
if(fileItem != null && fileItem.isDirectory()) {
190201
// Recursively descend into the clicked directory location:
191202
DisplayTypes.DirectoryResultContext nextFolder = fileItem.getParentFolderContext();
192203
if(nextFolder == null) {
193204
return false;
194205
}
206+
int fileItemPosIndex = getPositionForView(v);
195207
DisplayTypes.DirectoryResultContext workingFolder = DisplayFragments.getInstance().pathHistoryStack.peek();
196208
DisplayFragments.getInstance().pathHistoryStack.push(nextFolder);
197209
if(workingFolder == null) {
@@ -282,12 +294,7 @@ else if(DisplayFragments.getInstance().curSelectionCount >= DisplayFragments.get
282294
@Override
283295
public void onCheckedChanged(CompoundButton btnView, boolean isChecked) {
284296
CheckBox cbView = (CheckBox) btnView;
285-
int fileItemPosIndex = DisplayFragments.getInstance().findFileItemIndexByLayout((View) btnView.getParent());
286-
if(fileItemPosIndex < 0) {
287-
Log.i(LOGTAG, "onCheckedChanged: Unable to find parent view index ...");
288-
return;
289-
}
290-
DisplayTypes.FileType fileItem = DisplayFragments.getInstance().activeFileItemsDataList.get(fileItemPosIndex);
297+
DisplayTypes.FileType fileItem = BaseViewHolder.getFileItemForView((View) btnView.getParent());
291298
if(fileItem != null) {
292299
performNewFileItemClick(cbView, fileItem);
293300
}

AndroidFilePickerLightLibrary/src/main/java/com/maxieds/androidfilepickerlightlibrary/DisplayFragments.java

Lines changed: 0 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,6 @@ public void displayNextDirectoryFilesList(List<DisplayTypes.FileType> workingDir
223223
if(notifyAdapter) {
224224
DisplayAdapters.FileListAdapter rvAdapter = (DisplayAdapters.FileListAdapter) mainFileListRecyclerView.getAdapter();
225225
rvAdapter.reloadDataSets(fileItemBasePathsList, activeFileItemsDataList);
226-
//mainFileListRecyclerView.setAdapter(new DisplayAdapters.FileListAdapter(fileItemBasePathsList, activeFileItemsDataList));
227226
}
228227

229228
}
@@ -232,72 +231,6 @@ public void displayNextDirectoryFilesList(List<DisplayTypes.FileType> workingDir
232231
displayNextDirectoryFilesList(workingDirContentsList, true);
233232
}
234233

235-
public int findFileItemIndexByLayout(View layoutDisplayView) {
236-
int fileItemIndex = 0;
237-
for(DisplayTypes.FileType fileItem : activeFileItemsDataList) {
238-
// ??? TODO: Does this comparison method work ???
239-
if(fileItem.getLayoutContainer() != null && fileItem.getLayoutContainer() == layoutDisplayView) {
240-
return fileItemIndex;
241-
}
242-
++fileItemIndex;
243-
}
244-
return -1;
245-
}
246-
247-
public void insertItemsAtTop(List<String> fileNamesList, List<DisplayTypes.FileType> fileItemsList) {
248-
FileChooserRecyclerView mainRV = DisplayFragments.getInstance().getMainRecyclerView();
249-
fileItemsList.addAll(activeFileItemsDataList);
250-
activeFileItemsDataList = fileItemsList;
251-
fileNamesList.addAll(fileItemBasePathsList);
252-
fileItemBasePathsList = fileNamesList;
253-
}
254-
255-
public void appendItemsToBack(List<String> fileNamesList, List<DisplayTypes.FileType> fileItemsList) {
256-
//int lastItemsSize = displayCtx.activeFileItemsDataList.size();
257-
Log.i(LOGTAG, "Prev size = " + fileItemBasePathsList.size());
258-
activeFileItemsDataList.addAll(fileItemsList);
259-
fileItemBasePathsList.addAll(fileNamesList);
260-
Log.i(LOGTAG, "Post size = " + fileItemBasePathsList.size());
261-
//DisplayAdapters.FileListAdapter rvAdapter = (DisplayAdapters.FileListAdapter) displayCtx.getMainRecyclerView().getAdapter();
262-
//rvAdapter.notifyItemRangeInserted(lastItemsSize, displayCtx.activeFileItemsDataList.size());
263-
}
264-
265-
public void removeItemsAtTop(int itemCount) {
266-
FileChooserRecyclerView mainRV = DisplayFragments.getInstance().getMainRecyclerView();
267-
int startListIndex = itemCount;
268-
int endListIndex = activeFileItemsDataList.size();
269-
activeFileItemsDataList = new ArrayList<DisplayTypes.FileType>(
270-
activeFileItemsDataList.subList(
271-
startListIndex,
272-
endListIndex
273-
)
274-
);
275-
fileItemBasePathsList = new ArrayList<String>(
276-
fileItemBasePathsList.subList(
277-
startListIndex,
278-
endListIndex
279-
)
280-
);
281-
}
282-
283-
public void removeItemsFromBack(int itemCount) {
284-
FileChooserRecyclerView mainRV = DisplayFragments.getInstance().getMainRecyclerView();
285-
int startListIndex = 0;
286-
int endListIndex = activeFileItemsDataList.size() - itemCount - 1;
287-
activeFileItemsDataList = new ArrayList<DisplayTypes.FileType>(
288-
activeFileItemsDataList.subList(
289-
startListIndex,
290-
endListIndex
291-
)
292-
);
293-
fileItemBasePathsList = new ArrayList<String>(
294-
fileItemBasePathsList.subList(
295-
startListIndex,
296-
endListIndex
297-
)
298-
);
299-
}
300-
301234
public static class FileListItemFragment {
302235

303236
private static String LOGTAG = FileListItemFragment.class.getSimpleName();

AndroidFilePickerLightLibrary/src/main/java/com/maxieds/androidfilepickerlightlibrary/DisplayTypes.java

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -84,30 +84,33 @@ public void computeDirectoryContents(int startIndexPos, int maxIndexPos,
8484
int trimFromFrontCount, int trimFromBackCount, int newItemsCount,
8585
boolean updateGlobalIndices) {
8686
Log.i(LOGTAG, String.format(Locale.getDefault(), "STARTING: Computing dir contents [%d, %d] -- %s", startIndexPos, maxIndexPos, activeCWDAbsPath));
87+
if(startIndexPos >= getFolderChildCount() || maxIndexPos < startIndexPos) {
88+
Log.e(LOGTAG, String.format("RETURNING positions out of range %d / [%d, %d] ... ", getFolderChildCount(), startIndexPos, maxIndexPos));
89+
directoryContentsList.clear();
90+
return;
91+
}
8792
BasicFileProvider fpInst = BasicFileProvider.getInstance();
8893
if(fpInst == null) {
8994
return;
9095
}
91-
fpInst.setFilesStartIndex(startIndexPos);
92-
fpInst.setFilesListLength(maxIndexPos - startIndexPos + 1);
96+
if(newItemsCount > 0) {
97+
fpInst.setFilesStartIndex(maxIndexPos + 1 - Math.abs(newItemsCount));
98+
fpInst.setFilesListLength(Math.abs(newItemsCount));
99+
Log.i(LOGTAG, "REQUESTING start index = " + (maxIndexPos + 1 - Math.abs(newItemsCount)) + ", LEN = " + Math.abs(newItemsCount));
100+
}
101+
else {
102+
fpInst.setFilesStartIndex(startIndexPos);
103+
fpInst.setFilesListLength(Math.abs(newItemsCount));
104+
Log.i(LOGTAG, "REQUESTING start index = " + startIndexPos + ", LEN = " + Math.abs(newItemsCount));
105+
}
93106
int initStartIndexPos = startIndexPos;
94107
try {
95108
fpInst.noUpdateQueryFilesList(); // save some time processing if we haven't recently loaded a new folder to process
96109
String parentDocsId = parentDocId;
97110
initMatrixCursorListing = (MatrixCursor) fpInst.queryChildDocuments(parentDocsId, BasicFileProvider.DEFAULT_DOCUMENT_PROJECTION, "");
98-
int numItemsRequested = maxIndexPos + 1 - startIndexPos;
99-
maxIndexPos = maxIndexPos - startIndexPos;
100-
startIndexPos = 0;
101-
if(startIndexPos >= getInitialMatrixCursor().getCount() || maxIndexPos < startIndexPos) {
102-
Log.e(LOGTAG, String.format("RETURNING cursor positions out of range %d / [%d, %d] ... ", getInitialMatrixCursor().getCount(), startIndexPos, maxIndexPos));
103-
directoryContentsList.clear();
104-
return;
105-
}
106-
startIndexPos = newItemsCount < 0 ? startIndexPos : startIndexPos + numItemsRequested - newItemsCount;
107-
maxIndexPos = newItemsCount > 0 ? maxIndexPos : maxIndexPos + newItemsCount;
108-
initMatrixCursorListing.moveToPosition(maxIndexPos - startIndexPos + 1 - newItemsCount);
111+
initMatrixCursorListing.moveToPosition(0);
109112
boolean appendNewItems = newItemsCount > 0;
110-
List<FileType> filesDataList = new ArrayList<FileType>(directoryContentsList.subList(trimFromFrontCount, directoryContentsList.size() - trimFromBackCount));
113+
List<FileType> filesDataList = directoryContentsList.subList(trimFromFrontCount, directoryContentsList.size() - trimFromBackCount);
111114
int prependInsertIdx = 0, mcRowIdx;
112115
for (mcRowIdx = 0; mcRowIdx < Math.min(initMatrixCursorListing.getCount(), Math.abs(newItemsCount)); mcRowIdx++) {
113116
String[] filePropertiesList = fpInst.getPropertiesOfCurrentRow(initMatrixCursorListing, !BasicFileProvider.CURSOR_TYPE_IS_ROOT);
@@ -136,10 +139,11 @@ public void computeDirectoryContents(int startIndexPos, int maxIndexPos,
136139
DisplayFragments.getInstance().lastFileDataEndIndex = maxIndexPos - resultSizeDiff;
137140
}
138141
setNextDirectoryContents(filesDataList);
139-
//Log.i(LOGTAG, "computeDirectoryContents: PRINTING NEXT (truncated) folder contents list:");
140-
//for(int fcidx = 0; fcidx < directoryContentsList.size(); fcidx++) {
141-
// Log.i(LOGTAG, String.format(Locale.getDefault(), " [#%02d] FILE BASE NAME => \"%s\" ... ", fcidx + 1, directoryContentsList.get(fcidx).getBaseName()));
142-
//}
142+
Log.i(LOGTAG, "computeDirectoryContents: PRINTING NEXT (truncated) folder contents list:");
143+
for(int fcidx = Math.max(0, directoryContentsList.size() - 3); fcidx < directoryContentsList.size(); fcidx++) {
144+
Log.i(LOGTAG, String.format(Locale.getDefault(), " [#%02d => %02d ACTUAL Idx] FILE BASE NAME => \"%s\" ... ", fcidx + 1,
145+
fcidx + 1 + DisplayFragments.getInstance().lastFileDataStartIndex, directoryContentsList.get(fcidx).getBaseName()));
146+
}
143147
}
144148
catch(FileNotFoundException ioe) {
145149
ioe.printStackTrace();

0 commit comments

Comments
 (0)