AutoSize
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 20/100
Direzione di ricerca
Inizia con i metodi onMeasure, onLayoutChildren e measureScrapChild inclusi nell’issue, quindi esamina il comportamento di misurazione di Android RecyclerView LayoutManager. Riproduci il comportamento attuale delle dimensioni e chiarisci le dimensioni previste del ridimensionamento automatico prima di decidere quali test o altri file dovrebbero definire il completamento.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
@Override
public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
// 如果是 preLayout 则不重新布局
if (state.isPreLayout() || !state.didStructureChange()) {
return;
}
if (getItemCount() == 0) {
removeAndRecycleAllViews(recycler);
// 页面变化回调
setPageCount(0);
setPageIndex(0, false);
return;
} else {
setPageCount(getTotalPageCount());
setPageIndex(getPageIndexByOffset(), false);
}
// 计算页面数量
int mPageCount = getItemCount() / mOnePageSize;
if (getItemCount() % mOnePageSize != 0) {
mPageCount++;
}
// 计算可以滚动的最大数值,并对滚动距离进行修正
if (canScrollHorizontally()) {
mMaxScrollX = (mPageCount - 1) * getUsableWidth();
mMaxScrollY = 0;
if (mOffsetX > mMaxScrollX) {
mOffsetX = mMaxScrollX;
}
} else {
mMaxScrollX = 0;
mMaxScrollY = (mPageCount - 1) * getUsableHeight();
if (mOffsetY > mMaxScrollY) {
mOffsetY = mMaxScrollY;
}
}
// 接口回调
// setPageCount(mPageCount);
// setPageIndex(mCurrentPageIndex, false);
if (mItemWidth <= 0) {
mItemWidth = getUsableWidth() / mColumns;
}
if (mItemHeight <= 0) {
mItemHeight = getUsableHeight() / mRows;
}
mWidthUsed = getUsableWidth() - mItemWidth;
mHeightUsed = getUsableHeight() - mItemHeight;
// 预存储两页的View显示区域
for (int i = 0; i < mOnePageSize * 2; i++) {
getItemFrameByPosition(i);
}
if (mOffsetX == 0 && mOffsetY == 0) {
// 预存储View
for (int i = 0; i < mOnePageSize; i++) {
if (i >= getItemCount()) break; // 防止数据过少时导致数组越界异常
View view = recycler.getViewForPosition(i);
RecyclerView.LayoutParams lp = (RecyclerView.LayoutParams) view.getLayoutParams();
lp.width = ScreenUtils.getScreenWidth() / mColumns - (lp.leftMargin + lp.rightMargin) / 2;
addView(view);
measureChildWithMargins(view, mWidthUsed, mHeightUsed);
}
}
// 回收和填充布局
recycleAndFillItems(recycler, state, true);
}
@Override
public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state, int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(recycler, state, widthMeasureSpec, heightMeasureSpec);
int widthsize = View.MeasureSpec.getSize(widthMeasureSpec); //取出宽度的确切数值
int widthmode = View.MeasureSpec.getMode(widthMeasureSpec); //取出宽度的测量模式
// 将 wrap_content 转换为 match_parent
if (widthmode != EXACTLY && widthsize > 0) {
widthmode = EXACTLY;
}
final int heightMode = View.MeasureSpec.getMode(heightMeasureSpec);
final int heightSize = View.MeasureSpec.getSize(heightMeasureSpec);
int height = 0;
//自适应高度
for (int i = 0; i < getItemCount(); i++) {
try {
measureScrapChild(recycler, i,
widthMeasureSpec,
View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),
mMeasuredDimension);
} catch (IndexOutOfBoundsException e) {
e.printStackTrace();
}
if (i == 0) {
height = mMeasuredDimension[1];
}
}
switch (heightMode) {
case EXACTLY:
height = heightSize;
case View.MeasureSpec.AT_MOST:
case View.MeasureSpec.UNSPECIFIED:
}
setMeasuredDimension(View.MeasureSpec.makeMeasureSpec(widthsize, widthmode), height - 200);
}
private int[] mMeasuredDimension = new int[2];
private void measureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec, int heightSpec, int[] measuredDimension) {
View view = recycler.getViewForPosition(position);
if (view != null) {
RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) view.getLayoutParams();
int childHeightSpec = ViewGroup.getChildMeasureSpec(heightSpec,
getPaddingTop() + getPaddingBottom(), p.height);
view.measure(widthSpec, childHeightSpec);
measuredDimension[0] = view.getMeasuredWidth() + p.leftMargin + p.rightMargin;
measuredDimension[1] = view.getMeasuredHeight() + p.bottomMargin + p.topMargin;
recycler.recycleView(view);
}
}
- Lingua principale
- Java
- Stelle
- 1.1k
- Fork
- 181
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Preparare l'ambiente
Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di GcsSloop/pager-layoutmanager
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 25/100
GcsSloop/pager-layoutmanager#43 · 1 commento ·
-
在我的项目中一个都不显示了Aperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 15/100
GcsSloop/pager-layoutmanager#42 · 3 commenti ·
-
欢迎试用PagerGridLayoutManagerAperta
Difficoltà 5/5 Più di una settimana Idoneità per principianti 15/100
GcsSloop/pager-layoutmanager#41 · 1 commento · 5 reazioni ·
-
Add a English Readme.MD.Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 35/100
-
Difficoltà 5/5 Più di una settimana Idoneità per principianti 20/100
Tutte le issue di GcsSloop/pager-layoutmanager
Issue simili
-
API `/api/dataverses/{identifier}/dataset/linkingDataverses?alreadyLinking=true` returns at most 1 collectionForse già presa Una pull request collegata a questa issue è aperta o già unita. ApertaType: Bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
I maintainer di solito rispondono entro 1 giorno
-
javaoperatorsdk.client.oauth-token has no effect on the Kubernetes clientForse già presa @RaphaelFakhri l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
-
MCP add-on: JSON responses with non-ASCII characters are truncated (wrong Content-Length)Forse già presa @dhanushbs10 l’ha presa oggi. Apertaadd-on bug in:mcp
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 1 giorno
-
Map.Coordinate does not implement proper equalsForse già presa Una pull request collegata a questa issue è aperta o già unita. Apertavaadin-map
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
vaadin/flow-components#10586 ·
I maintainer di solito rispondono entro 1 giorno
-
WeReadInstaller writes the launcher database on the main thread at handover (Activity pause timeout)Apertabug good first issue
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100