Android : GridView auto_fit은 열 수를 어떻게 찾습니까?
Gridview
특히 어떻게 작동 하는지 더 잘 이해하고 싶습니다 auto_fit
. 다음은 XML 레이아웃입니다.
<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gridview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:columnWidth="60dp"
android:numColumns="auto_fit"
/>
일련의 6 개의 축소판 (48 * 48 픽셀)에서 잘 작동합니다. 세로 모드에서는 1 행, 6 열을 표시합니다.
내가 이해하지 못하는 android:columnWidth="60dp"
것은 auto_fit 이 올바른 수의 열을 찾을 것으로 예상 되기 때문에 라인 이 필요한 이유 입니다.
선이 없으면 android:columnWidth="60dp"
그리드 3 행 2 열이 표시됩니다.
ImageAdapter
수업 은 다음과 같습니다 .
package com.examples.HelloGridView;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
public class ImageAdapter extends BaseAdapter {
private Context mContext;
public ImageAdapter(Context c) {
mContext = c;
}
public int getCount() {
return mThumbIds.length;
}
public Object getItem(int position) {
return null;
}
public long getItemId(int position) {
return 0;
}
// create a new ImageView for each item referenced by the Adapter
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if (convertView == null) { // if it's not recycled, initialize some attributes
imageView = new ImageView(mContext);
imageView.setPadding(0, 0, 0, 0);
} else {
imageView = (ImageView) convertView;
}
imageView.setImageResource(mThumbIds[position]);
return imageView;
}
// references to our images
private Integer[] mThumbIds = {
R.drawable.ic_1, R.drawable.ic_2,
R.drawable.ic_3, R.drawable.ic_4,
R.drawable.ic_5, R.drawable.ic_6
};
}
도와 주셔서 감사합니다.
GridView 소스를 살펴보면 ImageView의 패딩과 높이를 설정해도 전혀 도움이되지 않음이 분명합니다. 열 너비를 지정하지 않으면 미리 설정된 열 수 (2) 만 선택합니다.
private void determineColumns(int availableSpace) {
...
if (mRequestedNumColumns == AUTO_FIT) {
if (requestedColumnWidth > 0) {
// Client told us to pick the number of columns
mNumColumns = (availableSpace + requestedHorizontalSpacing) /
(requestedColumnWidth + requestedHorizontalSpacing);
} else {
// Just make up a number if we don't have enough info
mNumColumns = 2;
}
} else {
// We picked the columns
mNumColumns = mRequestedNumColumns;
}
if (mNumColumns <= 0) {
mNumColumns = 1;
}
...
The solution is to measure your column size before setting the GridView's column width. Here is a quick way to measure Views offscreen:
public int measureCellWidth( Context context, View cell )
{
// We need a fake parent
FrameLayout buffer = new FrameLayout( context );
android.widget.AbsListView.LayoutParams layoutParams = new android.widget.AbsListView.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
buffer.addView( cell, layoutParams);
cell.forceLayout();
cell.measure(1000, 1000);
int width = cell.getMeasuredWidth();
buffer.removeAllViews();
return width;
}
And then you just set the GridView's column width:
gridView.setColumnWidth( width );
According to the android:numColumns documentation
auto_fit
Display as many columns as possible to fill the available space.
So if you insert ImageView
s with
padding
set to zero
margin
set to zero
layout_width
set to wrap_content
layout_height
set to wrap_content
The gridView should contain the maximum possible number of children
Keep in mind Your ImageViews maybe are getting scaled (:
This may help someone... You need to find width size manually. Based on the width size you can set column
float scalefactor = getResources().getDisplayMetrics().density * 100;
int number = getWindowManager()
.getDefaultDisplay().getWidth();
int columns = (int) ((float) number / scalefactor) / 2;
if (columns == 0 || columns == 1)
columns = 2;
gridView.setNumColumns(columns);
I find that I usually know how wide I want my columns to be. Either I know the size of my pictures or I let the user determine that size. Therefore i can just set the width in my Activity:
gridview = (GridView) findViewById(R.id.gridview);
SharedPreferences mySettings;
mySettings = getSharedPreferences(Constants.PREFERENCES, Context.MODE_PRIVATE);
int gridSize = 50 * Integer.parseInt(mySettings.getString("gridSize", "3"));
gridview.setColumnWidth(gridSize + 10);
Thats all . . .
스테판 루체른 인사말
"wrap_content"는 텍스트 편집기에서 자동 줄 바꿈처럼 작동합니다. 이미지가 마지막 열 크기에 맞지 않으면 이미지가 다음 행으로 이동합니다. 그러나 numcolumns 속성을 숫자로 설정하면 그리드가 열을 확장 / 조정할 수 있습니다 (stretchModde는 함께 사용할 수있는 또 다른 속성입니다).
추신-답을 선택했지만 이것이 도움이되었는지 알게되어 기쁠 것입니다.
'program tip' 카테고리의 다른 글
무한 루프는 컴파일 오류없이 메서드 서명을 중단합니다. (0) | 2020.11.18 |
---|---|
Java : java.util.Preferences 실패 (0) | 2020.11.18 |
루비 : define_method 대 def (0) | 2020.11.17 |
UITextField에서 리턴 키를 비활성화 / 활성화하는 방법은 무엇입니까? (0) | 2020.11.17 |
PHP에서 call_user_func_array로 생성자를 호출하는 방법 (0) | 2020.11.17 |