What you can do is use a recyclerView to generate the alphabet buttons using a Grid Layout.
here is an example obtained from Android RecyclerView Grid Layout Example
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
custom_view.xml
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:id="@+id/card_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
card_view:cardCornerRadius="4dp"
card_view:cardMaxElevation="4dp"
card_view:cardElevation="2dp"
card_view:contentPadding="5dp"
>
<LinearLayout
android:id="@+id/ll"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="3dp"
>
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textColor="#000"
android:textSize="25dp"
android:textStyle="bold"
android:layout_margin="2dp"
android:padding="10dp"
android:layout_gravity="center"
android:gravity="center"
/>
</LinearLayout>
MainActivity.java
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.Window;
import android.widget.RelativeLayout;
public class MainActivity extends AppCompatActivity {
private Context mContext;
RelativeLayout mRelativeLayout;
private RecyclerView mRecyclerView;
private RecyclerView.Adapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
// Request window feature action bar
requestWindowFeature(Window.FEATURE_ACTION_BAR);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Get the application context
mContext = getApplicationContext();
// Change the action bar color
getSupportActionBar().setBackgroundDrawable(
new ColorDrawable(Color.parseColor("#FF677589"))
);
// Get the widgets reference from XML layout
mRelativeLayout = (RelativeLayout) findViewById(R.id.rl);
mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
// Initialize a new String array
String[] animals = {
"Aardvark",
"Albatross",
"Alligator",
"Alpaca",
"Ant",
"Anteater",
"Antelope",
"Ape",
"Armadillo",
"Donkey",
"Baboon",
"Badger",
"Barracuda",
"Bear",
"Beaver",
"Bee"
};
/*
GridLayoutManager
A RecyclerView.LayoutManager implementations that lays out items in a grid.
By default, each item occupies 1 span. You can change it by providing a custom
GridLayoutManager.SpanSizeLookup instance via setSpanSizeLookup(SpanSizeLookup).
*/
/*
public GridLayoutManager (Context context, int spanCount)
Creates a vertical GridLayoutManager
Parameters
context : Current context, will be used to access resources.
spanCount : The number of columns in the grid
*/
// Define a layout for RecyclerView
mLayoutManager = new GridLayoutManager(mContext,3);
mRecyclerView.setLayoutManager(mLayoutManager);
// Initialize a new instance of RecyclerView Adapter instance
mAdapter = new AnimalsAdapter(mContext,animals);
// Set the adapter for RecyclerView
mRecyclerView.setAdapter(mAdapter);
}
}
AnimalsAdapter.java
import android.content.Context;
import android.graphics.Color;
import android.graphics.EmbossMaskFilter;
import android.graphics.drawable.GradientDrawable;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.util.Random;
public class AnimalsAdapter extends RecyclerView.Adapter {
private String [] mDataSet;
private Context mContext;
private Random mRandom = new Random ();
public AnimalsAdapter(Context context,String[] DataSet){
mDataSet = DataSet;
mContext = context;
}
public static class ViewHolder extends RecyclerView.ViewHolder{
public TextView mTextView;
public LinearLayout mLinearLayout;
public ViewHolder(View v){
super(v);
mTextView = (TextView) v.findViewById(R.id.tv);
mLinearLayout = (LinearLayout) v.findViewById(R.id.ll);
}
}
@Override
public AnimalsAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
// Create a new View
View v = LayoutInflater.from(mContext).inflate(R.layout.custom_view,parent,false);
ViewHolder vh = new ViewHolder(v);
return vh;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position){
holder.mTextView.setText(mDataSet[position]);
// Generate a random color
int color = getRandomHSVColor();
// Set a random color for TextView background
holder.mTextView.setBackgroundColor(getLighterColor(color));
// Set a text color for TextView
holder.mTextView.setTextColor(getReverseColor(color));
// Set a gradient background for LinearLayout
holder.mLinearLayout.setBackground(getGradientDrawable());
// Emboss the TextView text
applyEmbossMaskFilter(holder.mTextView);
}
@Override
public int getItemCount(){
return mDataSet.length;
}
// Custom method to apply emboss mask filter to TextView
protected void applyEmbossMaskFilter(TextView tv){
EmbossMaskFilter embossFilter = new EmbossMaskFilter(
new float[]{1f, 5f, 1f}, // direction of the light source
0.8f, // ambient light between 0 to 1
8, // specular highlights
7f // blur before applying lighting
);
tv.setLayerType(View.LAYER_TYPE_SOFTWARE,null);
tv.getPaint().setMaskFilter(embossFilter);
}
// Custom method to generate random HSV color
protected int getRandomHSVColor(){
// Generate a random hue value between 0 to 360
int hue = mRandom.nextInt(361);
// We make the color depth full
float saturation = 1.0f;
// We make a full bright color
float value = 1.0f;
// We avoid color transparency
int alpha = 255;
// Finally, generate the color
int color = Color.HSVToColor(alpha, new float[]{hue, saturation, value});
// Return the color
return color;
}
// Custom method to create a GradientDrawable object
protected GradientDrawable getGradientDrawable(){
GradientDrawable gradient = new GradientDrawable();
gradient.setGradientType(GradientDrawable.SWEEP_GRADIENT);
gradient.setColors(new int[]{getRandomHSVColor(), getRandomHSVColor(),getRandomHSVColor()});
return gradient;
}
// Custom method to get a darker color
protected int getDarkerColor(int color){
float[] hsv = new float[3];
Color.colorToHSV(color, hsv);
hsv[2] = 0.8f *hsv[2];
return Color.HSVToColor(hsv);
}
// Custom method to get a lighter color
protected int getLighterColor(int color){
float[] hsv = new float[3];
Color.colorToHSV(color,hsv);
hsv[2] = 0.2f + 0.8f * hsv[2];
return Color.HSVToColor(hsv);
}
// Custom method to get reverse color
protected int getReverseColor(int color){
float[] hsv = new float[3];
Color.RGBToHSV(
Color.red(color), // Red value
Color.green(color), // Green value
Color.blue(color), // Blue value
hsv
);
hsv[0] = (hsv[0] + 180) % 360;
return Color.HSVToColor(hsv);
}
}
build.gradle [dependencies]
implementation 'com.android.support:recyclerview-v7:28.0.0'
implementation 'com.android.support:cardview-v7:28.0.0'
You will get the following result
In this case you should adjust your view to show how you want the buttons