我有一个GridView在我的应用程序中持有TextViews,由于某种原因,最后一列是它的边缘切割(见下面的截图)。我猜它与GridView左侧的一点差距有关,但我不知道是什么导致它。
我使GridView背景比片段背景暗一点。
我的代码:
布局/ fragment.xml之:
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ADD178"
tools:context="com.example.myapp.Fragment"
android:id="@+id/constraintLayout">
<android.support.v7.widget.CardView
android:id="@+id/current_card"
android:layout_width="73dp"
android:layout_height="89dp"
app:cardBackgroundColor="#E917BC"
app:layout_constraintLeft_toLeftOf="@+id/constraintLayout"
android:layout_marginStart="16dp"
app:layout_constraintTop_toTopOf="@+id/constraintLayout"
android:layout_marginTop="16dp">
<TextView
android:id="@+id/current_card_letter"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="40dp"
android:gravity="center"
android:textColor="#000000"
tools:layout_editor_absoluteX="0dp"
tools:layout_editor_absoluteY="0dp"/>
</android.support.v7.widget.CardView>
<GridView
android:id="@+id/all_cards_grid_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:numColumns="auto_fit"
android:columnWidth="60dp"
android:horizontalSpacing="5dp"
android:verticalSpacing="5dp"
android:stretchMode="spacingWidthUniform"
android:background="#30000000"
app:layout_constraintLeft_toLeftOf="@+id/constraintLayout"
android:layout_marginStart="8dp"
app:layout_constraintTop_toBottomOf="@+id/current_card"
android:layout_marginTop="8dp"
app:layout_constraintRight_toRightOf="@+id/constraintLayout"
android:layout_marginEnd="8dp"
app:layout_constraintBottom_toBottomOf="@+id/constraintLayout"
android:layout_marginBottom="8dp"/>
</android.support.constraint.ConstraintLayout>
来自适配器的getView:
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
TextView textView;
if (convertView == null) {
textView = new TextView(mContext);
textView.setPadding(CARD_PADDING, CARD_PADDING, CARD_PADDING, CARD_PADDING);
textView.setLayoutParams(new GridView.LayoutParams(160, 160));
textView.setTextSize(40);
textView.setTextColor(Color.BLACK);
textView.setGravity(Gravity.CENTER);
} else {
textView = (TextView) convertView;
}
textView.setBackgroundResource(getItem(position).getThumbnailID());
textView.setText(getItem(position).getLetter());
return textView;
}
答案 0 :(得分:1)
您希望columnWidth
为60dp,并使用auto_fit
num_columns
属性GridView
测量列数。然后,在您的适配器中,您强制使用的项目大小与GridView
宽度和列数不匹配。
这是计算适合的实际columnWidth
的一种方法。不是100%确定这里的数学是否正确,但希望这可以帮助您解决问题。
如果您希望项目为矩形,则可以将计算出的宽度传递给适配器,并将其用于视图布局参数宽度和高度。
的活动:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final GridView gv = (GridView) findViewById(R.id.all_cards_grid_view);
gv.post(new Runnable() {
@Override
public void run() {
gv.setColumnWidth((gv.getWidth() - (gv.getNumColumns() * gv.getHorizontalSpacing())
- gv.getHorizontalSpacing() * 2) / gv.getNumColumns());
gv.setAdapter(new TestAdapter(MainActivity.this));
}
});
}
public class TestAdapter extends BaseAdapter {
private static final int CARD_PADDING = 10;
private Context mContext;
public TestAdapter(Context context) {
mContext = context;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
TextView textView;
if (convertView == null) {
textView = new TextView(mContext);
textView.setPadding(CARD_PADDING, CARD_PADDING, CARD_PADDING, CARD_PADDING);
//textView.setLayoutParams(new GridView.LayoutParams(200, 200));
textView.setTextSize(40);
textView.setTextColor(Color.BLACK);
textView.setBackgroundColor(Color.BLUE);
textView.setGravity(Gravity.CENTER);
} else {
textView = (TextView) convertView;
}
textView.setText("A");
return textView;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public int getCount() {
return 20;
}
}
XML:
<GridView
android:id="@+id/all_cards_grid_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:background="#30000000"
android:columnWidth="60dp"
android:numColumns="auto_fit"
android:horizontalSpacing="0dp"
android:stretchMode="spacingWidthUniform"
android:verticalSpacing="5dp"/>
答案 1 :(得分:1)
删除android:layout_marginStart和android:layout_marginEnd属性,它们将不再被推出界限。