두 개의 열과 자동 크기 조정 된 이미지가있는 그리드 뷰
두 개의 열로 그리드 뷰를 만들려고합니다. 나는이 이미지와 같이 행 당 두 장의 사진을 나란히 의미합니다.
그러나 내 사진의 크기가 같지 않기 때문에 사진 사이에 공백이 있습니다. 여기 내가 얻는 것이 있습니다.
보시다시피 첫 번째 사진은 연락처 이름과 전화 번호를 보여주는 범례를 숨 깁니다. 다른 사진은 올바르게 늘어나지 않습니다.
다음은 GridView xml 파일입니다. 보시다시피 columnWidth
가 200dp 로 설정되어 있습니다 . 자동 이므로 사진의 크기가 각 화면 크기에 따라 자동으로 조정됩니다.
<?xml version="1.0" encoding="utf-8"?>
<GridView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gridViewContacts"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:numColumns="2"
android:columnWidth="200dp"
android:stretchMode="columnWidth"
android:gravity="center" />
여기에 각 항목 자체를 나타내는 item xml 파일이 있습니다.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
android:id="@+id/imageViewContactIcon"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitXY" />
<LinearLayout
android:id="@+id/linearlayoutContactName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingLeft="5dp"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:background="#99000000"
android:layout_alignBottom="@+id/imageViewContactIcon">
<TextView
android:id="@+id/textViewContactName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FFFFFF"
android:textStyle="bold"
android:textSize="15sp"
android:text="Lorem Ipsum" />
<TextView
android:id="@+id/textViewContactNumber"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FFFFFF"
android:layout_marginLeft="5dp"
android:focusable="true"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:textSize="10sp"
android:text="123456789" />
</LinearLayout>
</RelativeLayout>
그래서 내가 원하는 것은 화면 크기에 관계없이 행 당 두 개의 이미지를 표시하고 이미지 크기가 자동으로 조정되는 것입니다. 내 레이아웃에서 내가 뭘 잘못하고 있니?
감사.
이 작업을 수행하는 비교적 쉬운 방법이 있습니다. GridView를 레이아웃에 던져서, 늘이기 모드를 설정하여 열 너비를 늘리고 간격을 0 (또는 원하는 것)으로 설정하고 열 수를 2로 설정하십시오.
res / layout / main.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<GridView
android:id="@+id/gridview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:verticalSpacing="0dp"
android:horizontalSpacing="0dp"
android:stretchMode="columnWidth"
android:numColumns="2"/>
</FrameLayout>
ImageView
가로 세로 비율을 유지 하는 사용자 정의 를 작성하십시오.
src / com / example / graphicstest / SquareImageView.java
public class SquareImageView extends ImageView {
public SquareImageView(Context context) {
super(context);
}
public SquareImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SquareImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
setMeasuredDimension(getMeasuredWidth(), getMeasuredWidth()); //Snap to width
}
}
이 SquareImageView를 사용하여 격자 항목의 레이아웃을 만들고 scaleType을 centerCrop으로 설정하십시오.
res / layout / grid_item.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.example.graphicstest.SquareImageView
android:id="@+id/picture"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"/>
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingTop="15dp"
android:paddingBottom="15dp"
android:layout_gravity="bottom"
android:textColor="@android:color/white"
android:background="#55000000"/>
</FrameLayout>
이제 다음과 같은 종류의 어댑터를 만드십시오 GridView
.
src / com / example / graphicstest / MyAdapter.java
private final class MyAdapter extends BaseAdapter {
private final List<Item> mItems = new ArrayList<Item>();
private final LayoutInflater mInflater;
public MyAdapter(Context context) {
mInflater = LayoutInflater.from(context);
mItems.add(new Item("Red", R.drawable.red));
mItems.add(new Item("Magenta", R.drawable.magenta));
mItems.add(new Item("Dark Gray", R.drawable.dark_gray));
mItems.add(new Item("Gray", R.drawable.gray));
mItems.add(new Item("Green", R.drawable.green));
mItems.add(new Item("Cyan", R.drawable.cyan));
}
@Override
public int getCount() {
return mItems.size();
}
@Override
public Item getItem(int i) {
return mItems.get(i);
}
@Override
public long getItemId(int i) {
return mItems.get(i).drawableId;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
View v = view;
ImageView picture;
TextView name;
if (v == null) {
v = mInflater.inflate(R.layout.grid_item, viewGroup, false);
v.setTag(R.id.picture, v.findViewById(R.id.picture));
v.setTag(R.id.text, v.findViewById(R.id.text));
}
picture = (ImageView) v.getTag(R.id.picture);
name = (TextView) v.getTag(R.id.text);
Item item = getItem(i);
picture.setImageResource(item.drawableId);
name.setText(item.name);
return v;
}
private static class Item {
public final String name;
public final int drawableId;
Item(String name, int drawableId) {
this.name = name;
this.drawableId = drawableId;
}
}
}
해당 어댑터를 다음으로 설정하십시오 GridView
.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
GridView gridView = (GridView)findViewById(R.id.gridview);
gridView.setAdapter(new MyAdapter(this));
}
그리고 결과를 즐기십시오 :
PercentRelativeLayout 과 같은 최신 내장 기능을 사용하는 또 다른 간단한 접근 방식이 이제이 문제에 부딪친 신규 사용자에게 제공됩니다. 이 항목을 출시 한 안드로이드 팀 덕분에.
<android.support.percent.PercentRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"
app:layout_widthPercent="50%">
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/picture"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop" />
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:background="#55000000"
android:paddingBottom="15dp"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingTop="15dp"
android:textColor="@android:color/white" />
</FrameLayout>
더 나은 성능을 위해 모든 이미지 부모의 전체 너비를 채우는 데 도움이되는 picasso 이미지 로더와 같은 것을 사용할 수 있습니다. 예를 들어, 어댑터에서 다음을 사용해야합니다.
int width= context.getResources().getDisplayMetrics().widthPixels;
com.squareup.picasso.Picasso
.with(context)
.load("some url")
.centerCrop().resize(width/2,width/2)
.error(R.drawable.placeholder)
.placeholder(R.drawable.placeholder)
.into(item.drawableId);
이제 더 이상 CustomImageView 클래스가 필요하지 않습니다.
추신 : 클래스 항목에서 유형 Int 대신 ImageView를 사용하는 것이 좋습니다.
이 도움을 바랍니다 ..
참고 URL : https://stackoverflow.com/questions/15261088/gridview-with-two-columns-and-auto-resized-images
'Programing' 카테고리의 다른 글
창 크기 조정의 jQuery (0) | 2020.05.22 |
---|---|
클릭 대신 부트 스트랩 팝 오버가 호버에서 나타나거나 사라지도록하십시오. (0) | 2020.05.22 |
OS X의`date` 명령에는 ISO 8601`-I` 옵션이 없습니까? (0) | 2020.05.22 |
mysql 데이터베이스에서 문자열의 모든 항목 검색 (0) | 2020.05.22 |
.NET에서 WebClient와 HTTPWebRequest 클래스 사이에는 어떤 차이점이 있습니까? (0) | 2020.05.21 |