2016-07-24 6 views
8

Ich habe eine GridView mit TextViews in meiner App und aus irgendeinem Grund die letzte Spalte bekommt es Randschnitt (siehe Screenshot unten). Ich nehme an, es hat etwas mit dem kleinen Spalt auf der linken Seite von GridView zu tun, aber ich weiß nicht, was das verursacht.Android GridView letzte Spalte immer geschnitten

Was mache ich hier falsch? screenshot

Ich habe den GridView-Hintergrund etwas dunkler als der Fragmenthintergrund gemacht.

Mein Code:

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 vom 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; 
} 
+0

Was passiert, wenn Sie 'android: columnWidth =" 60dp "' auf etwas kleineres verkleinern? –

+0

Da ich android benutze: numColumns = "auto_fit", macht es beim Reduzieren der columnWidth nur mehr Core-Spalten in jeder Zeile, und immer noch die letzte wird geschnitten. – Tako

+0

Haben Sie versucht, den 'stretchMode' in' android: stretchMode = "columnWidth" '' zu ändern? – Rehan

Antwort

1

Remove android: layout_marginStart und android: layout_marginEnd Attribute, und sie werden außerhalb der Grenzen geschoben stoppen.

1

Sie columnWidth wollen, sind 60dp zu sein und durch die Verwendung auto_fitnum_columns Eigenschaft Die GridView misst die Anzahl der Spalten. In Ihrem Adapter erzwingen Sie dann die Artikelgröße, die dann nicht mit der GridView Breite und Anzahl der Spalten übereinstimmt.

Hier ist eine Möglichkeit, die tatsächliche columnWidth zu berechnen, die passen wird. Nicht 100% sicher, ob die Mathematik hier korrekt ist, aber das könnte Ihnen hoffentlich helfen, Ihr Problem zu lösen.

Wenn Elemente rechteckig sein sollen, könnten Sie die berechnete Breite an den Adapter übergeben und diese für die Breite und Höhe des Ansichtslayouts verwenden.

Aktivität:

@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"/> 
+0

Wenn ich diese Lösung versuche, die Karten schrumpft ein wenig und die GridView fügt eine weitere Karte in die Zeile, so dass die letzte Spalte noch geschnitten wird Wenn ich den Parameter numColumns in eine konstante Zahl ändere, werden die Leerzeichen zwischen den Karten immer größer und die letzte Zeile wird abgeschnitten Die Art und Weise, wie ich davon ausgehe, ist, dass die Breite der Spalte/Karte fest codiert ist. und die Zwischenräume zwischen den Karten werden wachsen oder schrumpfen, um auf verschiedene Bildschirmgrößen zu passen. " Ich bin mir ziemlich sicher, dass ich gerade etwas an der wid verpasse th der GridView. – Tako