ns2016
ns2016

Reputation: 63

How do I Remove Cell Padding in a Gridview

I'm hoping someone can help me. I have created a Sudoku app. I have a grid view that shows string text from a list view. I have a problem with my layout of the Grid View on my phone and tablet; , see 1st and 2nd screens below .

What I'm trying to do is set the screen, so the grid display neatly just above the numbers 1 to 5. Ideally I'd like it to render appropriately on tablet and phone.

On a Phone the last row of the sudoku grid showing underneath the first set of button button See firstImage. Whereas on a Tablet there is a huge gap between the gridvview and the Buttons

What I have I tried so far: I tried android:layout_above btn1. But that chopped off the last row of the sudoku grid and I had to drag the grid up and down to see the last row on a phone. It also caused the app to crash of a phone. Not good.

I tried putting a frame layout inside the relative layout and putting the gridview inside of that. But that had the also chopped off the last row of the sudoku grid as per layout_above.

Really what I'd like to do is, on a phone I would like to remove or reduce the padding above and below each number in each cell in the grid view. As the cell padding makes each cell in the grid 2 - 3 times bigger than it needs to be. This is a problem on a 5" mobile phone screen. I have tried the following and none of them worked.

How do I get rid of unwanted padding in a Listview row android:gravity - Made no Difference

How to avoid space between imageview and gridview in linearlayout listSelector=”@null” - Made no difference

Removing the extra padding in a GridView in android stretchMode(0); - Everything disappeared.

How do I get rid of unwanted padding in a Listview row view.setMinimumHeight(0); - Made no difference.

I also tried view.setPadding(); it was useful in that the padding on the left hand side was removed, but it didn't remove the papdding at the top or bottom.
view.setPadding(dpToPx(0, parent), 0, 0, 0);

I am at a loss at this stage about how to move this forward and am worried that trying all these different things is making me more confused. If someone could point me in the correct direction I'd be very grateful. Code is shown below.
Render on 5" Phone Rednder on a Tablet content_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.example.admin1.sudoku.MainActivity"
    android:background="#663399"
    tools:showIn="@layout/activity_main">

    <Button
        android:id="@+id/btn1"
        style="?android:attr/buttonStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/btn1Label"
        android:layout_above="@+id/btn6"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignBottom="@+id/btn2"
        />

    <Button
        android:id="@+id/btn2"
        style="?android:attr/buttonStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/btn2Label"
        android:layout_above="@+id/btn7"
        android:layout_toLeftOf="@+id/btn8"
        android:layout_toStartOf="@+id/btn8" />
    <Button
        android:id="@+id/btn3"
        style="?android:attr/buttonStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/btn3Label"
        android:layout_alignTop="@+id/btn2"
        android:layout_toRightOf="@+id/btn2"
        android:layout_toEndOf="@+id/btn2" />
    <Button
        android:id="@+id/btn4"
        style="?android:attr/buttonStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/btn4Label"
        android:layout_alignTop="@+id/btn3"
        android:layout_toRightOf="@+id/btn3"
        android:layout_toEndOf="@+id/btn3" />
    <Button
        android:id="@+id/btn5"
        style="?android:attr/buttonStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/btn5Label"
        android:layout_alignTop="@+id/btn4"
        android:layout_toRightOf="@+id/btn4"
        android:layout_toEndOf="@+id/btn4" />
    <Button
        android:id="@+id/btn6"
        style="?android:attr/buttonStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/btn6Label"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />
    <Button
        android:id="@+id/btn7"
        style="?android:attr/buttonStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/btn7Label"
        android:layout_alignParentBottom="true"
        android:layout_toRightOf="@+id/btn6"
        android:layout_toEndOf="@+id/btn6" />
    <Button
        android:id="@+id/btn8"
        style="?android:attr/buttonStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/btn8Label"
        android:layout_alignParentBottom="true"
        android:layout_toRightOf="@+id/btn7"
        android:layout_toEndOf="@+id/btn7" />
    <Button
        android:id="@+id/btn9"
        style="?android:attr/buttonStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/btn9Label"
        android:layout_alignParentBottom="true"
        android:layout_toRightOf="@+id/btn3"
        android:layout_toEndOf="@+id/btn3" />
    <Button
        android:id="@+id/btn0"
        style="?android:attr/buttonStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/btn0Label"
        android:layout_alignParentBottom="true"
        android:layout_toRightOf="@+id/btn9"
        android:layout_toEndOf="@+id/btn9" />
    <Button
        android:id="@+id/btnCheck"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/btnCheckLabel"
        android:layout_below="@+id/gridView1"
        android:layout_alignTop="@+id/btn5"
        android:layout_toRightOf="@+id/btn5"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />

    <Button
        android:id="@+id/btnHint"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/btnHintLabel"
        android:layout_alignTop="@+id/btn0"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:layout_alignLeft="@+id/btnCheck"
        android:layout_alignStart="@+id/btnCheck" />

    <GridView
        android:id="@+id/gridView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:numColumns="9"
        android:columnWidth="0dp"
        android:horizontalSpacing="5dp"
        android:verticalSpacing="5dp"
        android:clipChildren="true"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:background="#C0C0C0"
        android:padding="5dp"
        android:textSize="12sp"
        android:stretchMode="columnWidth"
        android:gravity="clip_vertical"
        />
</RelativeLayout>

MainActivity.java

package com.example.admin1.sudoku;


import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.DisplayMetrics;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.GridView;
import android.widget.ArrayAdapter;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.graphics.Color;
import android.widget.Toast;

import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import android.content.res.Resources;
import android.media.MediaPlayer;

public class MainActivity extends AppCompatActivity {
    // Class that holds the creation of a Sudoku Puzzle
    private SudokuPuzzle clsSudoku;

    //Variables used throughout the program.
    private final int iMaxCells = 81;
    private String[] stResult;     // Holds the solution to the current puzzle
    private int[]    iExcluded;    // Holds all the  blue cells (clues given to the user at the start)
                                   // Placed into List for fast searching
    private int      iElement;
    private boolean  blShowResult; // Indicates if the user has clicked Show Result
    private boolean  blGiveHint;   // Indicates if the user has clicked Give Hint
    private boolean  blSoundOn;

    // UI Elements
    private View     tvCell;
    private GridView gridView;
    private Menu     menu;
    private MediaPlayer mp = null;

    /*  Lists
    lstitems holds all the items in the current board including user entries
    lstExclude holds all the  blue cells (clues given to the user at the start)
    adapter
     */
    private List<String> lstItems;
    private ArrayAdapter<String> adapter ;
    private List<Integer> lstExcluded;

    public MainActivity() {
        stResult  = new String[iMaxCells];
        blGiveHint = false;
        blShowResult = false;
        iElement = 0;
        blSoundOn = false;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        // Declare used buttons
        Button btn1 = (Button) findViewById(R.id.btn1);
        Button btn2 = (Button) findViewById(R.id.btn2);
        Button btn3 = (Button) findViewById(R.id.btn3);
        Button btn4 = (Button) findViewById(R.id.btn4);
        Button btn5 = (Button) findViewById(R.id.btn5);
        Button btn6 = (Button) findViewById(R.id.btn6);
        Button btn7 = (Button) findViewById(R.id.btn7);
        Button btn8 = (Button) findViewById(R.id.btn8);
        Button btn9 = (Button) findViewById(R.id.btn9);
        Button btn0 = (Button) findViewById(R.id.btn0);
        Button btnHint = (Button) findViewById(R.id.btnHint);
        Button btnCheck = (Button) findViewById(R.id.btnCheck);

        //Creates a new Game
        clsSudoku = new SudokuPuzzle();
        newGame();

        gridView = (GridView) findViewById(R.id.gridView1);

        gridView.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View v,
                                    int position, long id) {
                if (blGiveHint == true){
                    blGiveHint = false;
                    //Initialise any hinted cells back to white
                    clearCells();
                }

                if (!blShowResult){
                    tvCell = gridView.getChildAt(iElement);
                    try{
                        tvCell.setBackgroundColor(Color.WHITE);
                        iElement = position;
                        tvCell = gridView.getChildAt(iElement);
                        tvCell.setBackgroundColor(Color.RED);

                    }
                    catch(Exception e){

                    }
                }
            }
        });



        gridView.setAdapter(adapter = new ArrayAdapter<String>(MainActivity.this,
                android.R.layout.simple_list_item_1, lstItems) {
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                View view = super.getView(position, convertView, parent);


                view.setPadding(dpToPx(0, parent), 0, 0, 0);
                view.setMinimumHeight(0);
                if (position == iElement && !blShowResult){
                    view.setBackgroundColor(Color.RED);
                }
                else if (lstExcluded.contains(position)) {
                    view.setBackgroundColor(Color.WHITE);
                }
                else{
                    view.setBackgroundColor(Color.CYAN);
                }

                return view;
            }

            @Override
            public boolean isEnabled(int position) {

                // Item position which you want to disable.
                if (!lstExcluded.contains(position) ) {
                    return false;
                }
                else {
                    return true;
                }
            }

        });

        btn1.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                if (adapter.isEnabled(iElement) && !blShowResult){
                    lstItems.set(iElement, "1");
                    adapter.notifyDataSetChanged();
                }
            }
        });

        btn2.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                if (adapter.isEnabled(iElement) && !blShowResult){
                    lstItems.set(iElement, "2");
                    adapter.notifyDataSetChanged();
                }
            }
        });
        btn3.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                if (adapter.isEnabled(iElement) && !blShowResult){
                    lstItems.set(iElement, "3");
                    adapter.notifyDataSetChanged();
                }
            }
        });

        btn4.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                if (adapter.isEnabled(iElement) && !blShowResult){
                    lstItems.set(iElement, "4");
                    adapter.notifyDataSetChanged();
                }
            }
        });

        btn5.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                if (adapter.isEnabled(iElement) && !blShowResult){
                    lstItems.set(iElement, "5");
                    adapter.notifyDataSetChanged();
                }
            }
        });

        btn6.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                if (adapter.isEnabled(iElement) && !blShowResult){
                    lstItems.set(iElement, "6");
                    adapter.notifyDataSetChanged();
                }
            }
        });

        btn7.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                if (adapter.isEnabled(iElement) && !blShowResult){
                    lstItems.set(iElement, "7");
                    adapter.notifyDataSetChanged();
                }
            }
        });

        btn8.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                if (adapter.isEnabled(iElement) && !blShowResult){
                    lstItems.set(iElement, "8");
                    adapter.notifyDataSetChanged();
                }
            }
        });

        btn9.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                if (adapter.isEnabled(iElement) && !blShowResult){
                    lstItems.set(iElement, "9");
                    adapter.notifyDataSetChanged();
                }
            }
        });

        btn0.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                if (adapter.isEnabled(iElement) && !blShowResult){
                    lstItems.set(iElement, "");
                    adapter.notifyDataSetChanged();
                }
            }
        });

        btnHint.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                blGiveHint = true;
                giveHint();
            }
        });



        btnCheck.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                checkCorrect();
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        this.menu = menu;
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        switch(id){
            case R.id.new_game:
                createNewGame();
                return true;
            case R.id.show_result:
                getResult();
                return true;
            case R.id.sound_toggle:
                setSoundSettings();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }


    // Populate a list for fast searching later
    private void populateExcludeList(int[] ipiArray){
        lstExcluded.clear();
        for (int iCnt = 0; iCnt < ipiArray.length; iCnt++){
            lstExcluded.add(ipiArray[iCnt] - 1);
        }
        Collections.sort(lstExcluded);
    }

    // Populate a list for fast searching later
    private void setBoard(String[] ipstArray){
        lstItems.clear();
        for (int iCnt = 0; iCnt < ipstArray.length; iCnt++){
            lstItems.add(ipstArray[iCnt]);
        }
    }

    // Create a new puzzle
    private void newGame(){
        String[] stNumbers = new String[iMaxCells];
        blShowResult = false;


        clsSudoku.swapTwoNumbers();
        clsSudoku.swapTwoColumns();
        clsSudoku.swapTwoBlocks();
        clsSudoku.rotateNintyDegrees();
        clsSudoku.clearNumbers();
        stNumbers = clsSudoku.getResult("User");
        stResult  = clsSudoku.getResult("Result");

        iExcluded = clsSudoku.getRemoved();

        if (lstItems == null) {
            lstItems = new ArrayList<String>(Arrays.asList(stNumbers));
        }
        else {
            setBoard(stNumbers);
        }
        lstExcluded = new ArrayList<Integer>();
        populateExcludeList(iExcluded);
        iElement = lstExcluded.get(0);
    }

    private void createNewGame(){
        if ( !lstItems.isEmpty() ){
            lstItems.clear();
        }
        newGame();
        adapter.notifyDataSetChanged();
    }
    private void getResult(){
        blShowResult = true;

        setBoard(stResult);
        lstExcluded = new ArrayList<Integer>();
        populateExcludeList(iExcluded);
        adapter.notifyDataSetChanged();
    }

    public void giveHint(){
        for (int iCnt = 0; iCnt < iMaxCells; iCnt++){

            tvCell = gridView.getChildAt(iCnt);
            try{
                if (lstItems.get(iCnt).equalsIgnoreCase(stResult[iCnt]) == false && blGiveHint == true){
                    tvCell.setBackgroundColor(Color.RED);
                }
                else if(lstItems.get(iCnt).equalsIgnoreCase(stResult[iCnt]) && lstExcluded.contains(iCnt) ){
                    tvCell.setBackgroundColor(Color.WHITE);

                }
            }
            catch(Exception e){
                Toast.makeText(this, "Error: " +  e.getMessage(),Toast.LENGTH_LONG).show();
            }

        }
    }
    public void checkCorrect(){
        boolean blErrorFound = false;
        int iCntErrors = 0;
        int iCntBlanks = 0;
        String stMessage = "";

        for (int iCnt = 0; iCnt < iMaxCells; iCnt++){
            if ( (lstItems.get(iCnt).equalsIgnoreCase("") == true)
                    ){
                iCntBlanks = iCntBlanks + 1;
                blErrorFound = true;
            }
            else if((lstItems.get(iCnt).equalsIgnoreCase(stResult[iCnt]) == false) &&
                    (lstItems.get(iCnt).equalsIgnoreCase("") == false)
                    ){
                iCntErrors = iCntErrors + 1;
                blErrorFound = true;
            }
        }

        if (!blErrorFound){
            stMessage = "Congratulations !!! Your solution is correct";
            if (blSoundOn == true){
                playSound("congratulations");
            }
        }
        else{
            stMessage = "You have " + iCntErrors + " errors and " + iCntBlanks + " squares left to do";
            if (blSoundOn == true){
                playSound("wrong");
            }
        }
        Toast.makeText(getApplicationContext(), stMessage, Toast.LENGTH_LONG).show();
    }

    private void clearCells(){
        for (int iCnt = 0; iCnt < iMaxCells; iCnt++){
            tvCell = gridView.getChildAt(iCnt);
            if(lstExcluded.contains(iCnt) ){
                tvCell.setBackgroundColor(Color.WHITE);

            }
        }
    }

    private void setSoundSettings() {
        MenuItem miMenu = menu.findItem(R.id.sound_toggle);
        if (blSoundOn) {
            blSoundOn = false;
            miMenu.setTitle("Turn Sound On");
        } else {
            blSoundOn = true ;
            miMenu.setTitle("Turn Sound Off");
        }
    }
    public void playSound(String stFileName){
        int iSoundId;

        if (mp != null){
            mp.reset();
            mp.release();
        }
        Resources res = getApplicationContext().getResources();
        iSoundId = res.getIdentifier(stFileName, "raw", getApplicationContext().getPackageName());

        mp = MediaPlayer.create(getApplicationContext(), iSoundId);
        mp.start();
    }
    public int dpToPx(int dp, View v) {
        DisplayMetrics displayMetrics = v.getContext().getResources().getDisplayMetrics();
        return Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));
    }
}

Upvotes: 0

Views: 290

Answers (0)

Related Questions