blob: c7b0b23198da3c06acf23b1ecb2097738194a7ec [file] [log] [blame]
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.arch.paging;
import android.support.annotation.RestrictTo;
import java.util.AbstractList;
import java.util.List;
/**
* NullPaddedList is a simple list, with optional null padding on the beginning and end.
*
* @param <Type> The type of the entries in the list.
*
* @hide
*/
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
public class NullPaddedList<Type> extends AbstractList<Type> {
List<Type> mList;
private int mTrailingNullCount;
private int mLeadingNullCount;
private int mPositionOffset;
@Override
public String toString() {
return "NullPaddedList " + mLeadingNullCount
+ ", " + mList.size()
+ ", " + mTrailingNullCount;
}
/**
* Create a static, immutable NullPaddedList with the specified list,
*
* @param leadingNullCount Number of empty items in advance of the passed list.
* @param list List of items.
* @param trailingNullCount Number of empty items following the passed list.
*/
NullPaddedList(int leadingNullCount, List<Type> list, int trailingNullCount) {
if (leadingNullCount < 0 || trailingNullCount < 0) {
throw new IllegalArgumentException("leading/trailing null count must be non-negative");
}
if (list == null) {
throw new IllegalArgumentException("list must be non-null");
}
mList = list;
mLeadingNullCount = leadingNullCount;
mTrailingNullCount = trailingNullCount;
}
NullPaddedList(int leadingNullCount, int totalCount, List<Type> list) {
if (list == null) {
throw new IllegalArgumentException("list must be non-null");
}
int trailingNullCount = totalCount - (leadingNullCount) - list.size();
mList = list;
mLeadingNullCount = leadingNullCount;
mTrailingNullCount = trailingNullCount;
}
NullPaddedList(int positionOffset, List<Type> list) {
if (list == null) {
throw new IllegalArgumentException("list must be non-null");
}
mList = list;
mPositionOffset = positionOffset;
}
// --------------- PagedList API ---------------
@Override
public Type get(int index) {
if (index < 0 || index >= size()) {
throw new IndexOutOfBoundsException();
}
index -= mLeadingNullCount;
if (index < 0) {
return null;
}
if (index >= mList.size()) {
return null;
}
return mList.get(index);
}
@Override
public final int size() {
return getLoadedCount() + getLeadingNullCount() + getTrailingNullCount();
}
// --------------- Contiguous API ---------------
public int getPositionOffset() {
return mPositionOffset;
}
/**
* Number of loaded items. This does not account for leading or trailing null padding.
*
* @return Number of loaded items.
*/
public int getLoadedCount() {
return mList.size();
}
/**
* Number of empty, unloaded items ahead of the loaded item region.
*
* @return Number of nulls before the loaded list.
*/
public int getLeadingNullCount() {
return mLeadingNullCount;
}
/**
* Number of empty, unloaded items behind the loaded item region.
*
* @return Number of nulls after the loaded list.
*/
public int getTrailingNullCount() {
return mTrailingNullCount;
}
}