Last column of Android GridView

I have a GridView containing TextViews in my application, and for some reason the last column crop it (see screenshot below). I guess this has something to do with the small gap on the left side of the GridView, but I don't know what causes it.

What am I doing wrong here? screenshot

I made the GridView background a bit darker than the fragment background.

My code is:

Layout / 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 from adapter:

 @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; } 
+8
android gridview
source share
2 answers

Remove the android: layout_marginStart and android: layout_marginEnd attributes and they will no longer be clicked outside.

+1
source share

You want the columnWidth be 60dp, and using the auto_fit num_columns , the GridView value measures the number of columns. In your adapter, you force the size of the element, which then does not match the width and number of columns of the GridView .

Here is one way to calculate the actual columnWidth that will fit. Not 100% sure that the math is right here, but I hope this can give you the opportunity to solve your problem.

If you want the elements to be rectangles, you could pass the calculated width to the adapter and use for the width and height of the view layout.

Activity:

 @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
source share

All Articles