Skip to content

Instantly share code, notes, and snippets.

@vic797
Last active October 21, 2020 18:31
Show Gist options
  • Save vic797/3751625f6bbadb55f68d0babf06417a6 to your computer and use it in GitHub Desktop.
Save vic797/3751625f6bbadb55f68d0babf06417a6 to your computer and use it in GitHub Desktop.
Grid layout pager adapter
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.GridView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.viewpager.widget.PagerAdapter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public abstract class GridPagerAdapter<T> extends PagerAdapter {
private int columnCount, rowCount;
private List<GridView> gridViews;
private Context context;
public GridPagerAdapter(Context context, int columnCount, int rowCount) {
this.context = context;
this.rowCount = rowCount;
this.columnCount = columnCount;
gridViews = new ArrayList<>();
}
@Override
public int getCount() {
return gridViews.size();
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
return view == object;
}
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
GridView view = gridViews.get(position);
container.addView(view, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
return view;
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
container.removeView((View) object);
}
@Override
public void finishUpdate(@NonNull ViewGroup container) {
super.finishUpdate(container);
}
protected Context getContext() {
return context;
}
public void updatePageContents() {
int maxItems = columnCount * rowCount;
int pages = Math.round((float)getItemCount() / (float)maxItems);
adjustPageCount(pages);
int itemCount = 0;
for (int i = 0; i < pages; i++) {
List<T> pageItems = new ArrayList<>();
int max = itemCount + maxItems; //Math.min(itemCount + maxItems, getCount());
for (; itemCount < max; itemCount++) {
try {
pageItems.add(getItem(itemCount));
} catch (IndexOutOfBoundsException ignored) {
break;
}
}
setGridAdapter(pageItems, i);
}
}
public abstract View getViewItem(T item, ViewGroup parent);
public abstract T getItem(int pos);
public abstract int getItemCount();
public void onItemClick(T item, View view) {}
public boolean onItemLongClick(T item, View view) {
return false;
}
private void setGridAdapter(List<T> items, int page) {
gridViews.get(page).setAdapter(new GridAdapter(context, items));
}
private void adjustPageCount(int pages) {
if (gridViews.size() > pages) {
while (gridViews.size() > pages) {
gridViews.remove(gridViews.size() - 1);
}
} else if (gridViews.size() < pages) {
while (gridViews.size() < pages) {
GridView g = new GridView(context);
g.setNumColumns(columnCount);
gridViews.add(g);
}
}
notifyDataSetChanged();
}
class GridAdapter extends ArrayAdapter<T> {
public GridAdapter(@NonNull Context context, List<T> items) {
super(context, 0, items);
}
public GridAdapter(@NonNull Context context) {
super(context, 0, Collections.<T>emptyList());
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
final T item = getItem(position);
View view = GridPagerAdapter.this.getViewItem(item, parent);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onItemClick(item, v);
}
});
view.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
return onItemLongClick(item, v);
}
});
return view;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment