Last active
October 21, 2020 18:31
-
-
Save vic797/3751625f6bbadb55f68d0babf06417a6 to your computer and use it in GitHub Desktop.
Grid layout pager adapter
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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