Of course, in this post, I will present a solution to make this design by using an external library. Please see this DEMO VIDEO first:
Import libary to Project
compile 'com.amulyakhare:com.amulyakhare.textdrawable:1.0.1'Sync gradle and now start coding!
Declaring project layout
With each ListView row, providing an ImageView in the left side. On it, we will make a letter icon:
Programmatically coding
ColorGenerator generator = ColorGenerator.MATERIAL; // or use DEFAULT // generate random color int color = generator.getColor(getItem(position)); //int color = generator.getRandomColor(); TextDrawable drawable = TextDrawable.builder() .buildRound(firstLetter, color); // radius in pxBy getColor() method, each row color is not changed when we scroll ListView:
If you change to getRandomColor(), each letter background color will be changed when ListView scrolled:
By reading libray doc, we can make more effects/animations, for example, change buildRound() in above code to buildRoundRect(), the left icon will have a rectangle background:
This is full code for our ListView adapter, based on ArrayAdapter, I use a ViewHolder class to help ListView scroll smoother:
package devexchanges.info.letterlistview; import android.app.Activity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.TextView; import com.amulyakhare.textdrawable.TextDrawable; import com.amulyakhare.textdrawable.util.ColorGenerator; import java.util.List; public class ListViewAdapter extends ArrayAdapter<String> { private MainActivity activity; private List<String> friendList; public ListViewAdapter(MainActivity context, int resource, List<String> objects) { super(context, resource, objects); this.activity = context; this.friendList = objects; } @Override public int getCount() { return friendList.size(); } @Override public String getItem(int position) { return friendList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); // If holder not exist then locate all view from UI file. if (convertView == null) { // inflate UI from XML file convertView = inflater.inflate(R.layout.item_listview, parent, false); // get all UI view holder = new ViewHolder(convertView); // set tag for holder convertView.setTag(holder); } else { // if holder created, get tag from view holder = (ViewHolder) convertView.getTag(); } holder.friendName.setText(getItem(position)); //get first letter of each String item String firstLetter = String.valueOf(getItem(position).charAt(0)); ColorGenerator generator = ColorGenerator.MATERIAL; // or use DEFAULT // generate random color int color = generator.getColor(getItem(position)); //int color = generator.getRandomColor(); TextDrawable drawable = TextDrawable.builder() .buildRound(firstLetter, color); // radius in px holder.imageView.setImageDrawable(drawable); return convertView; } private class ViewHolder { private ImageView imageView; private TextView friendName; public ViewHolder(View v) { imageView = (ImageView) v.findViewById(R.id.image_view); friendName = (TextView) v.findViewById(R.id.text); } } }In main activity, set adapter for ListView with dummy data, nothing special in it:
package devexchanges.info.letterlistview; import android.os.Bundle; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.Snackbar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.View; import android.widget.ArrayAdapter; import android.widget.ListView; import java.util.ArrayList; public class MainActivity extends AppCompatActivity { private ListView listView; private ArrayList<String> stringArrayList; private ArrayAdapter<String> adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = (ListView) findViewById(R.id.list_item); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); setData(); adapter = new ListViewAdapter(this, R.layout.item_listview, stringArrayList); listView.setAdapter(adapter); } private void setData() { stringArrayList = new ArrayList<>(); stringArrayList.add("Quỳnh Trang"); stringArrayList.add("Hoàng Biên"); stringArrayList.add("Đức Tuấn"); stringArrayList.add("Đặng Thành"); stringArrayList.add("Xuân Lưu"); stringArrayList.add("Phạm Thanh"); stringArrayList.add("Kim Kiên"); stringArrayList.add("Ngô Trang"); stringArrayList.add("Thanh Ngân"); stringArrayList.add("Nguyễn Dương"); stringArrayList.add("Quốc Cường"); stringArrayList.add("Trần Hà"); } }