Android converts Chinese characters into Pinyin, achieves A-Z alphabetic sorting of ListView, and displays multi-syllable city sorting.

Keywords: Mobile Android ascii Java Database

Android implements the A-Z alphabet sorting and filtering search function of ListView, and realizes the conversion of Chinese characters into Pinyin.


Content source: http://blog.csdn.net/xiaanming/article/details/12684155
I just made some minor changes according to my own needs and sent out a memorandum.

Today we bring you the A-Z alphabet sorting and filtering search function of ListView and the function of converting Chinese characters into Pinyin. We know that in general we can achieve A-Z sorting for contacts, City lists and so on, because contacts and city lists can directly obtain the Pinyin of Chinese characters from the database. For general data, how can we achieve A-Z sorting, we need Converting Chinese characters into Pinyin is enough. Next, I'll take you to realize the A-Z sorting function of general data. First, I'll look at the effect map.

=========================================================================

My project needs index letters on the right side to show only the corresponding letters of the list with data, and multi-syllable City sorting (Chongqing, Changsha are under the C letter), the effect map

================================================================================

Above is an EditText with a delete button. When we enter the input box, we can automatically filter out what we want. When no data in the input box is automatically replaced by the original data list, then the next ListView is used to display the data list. On the right side is an alphabetical index table. When we click on different letters, ListView will locate the letter and understand the cloth. After the bureau, let's look at the project structure first.

I'll introduce its functions in the order of the classes in the project.

1.SortModel is an entity class, one of which is the name of ListView, and the other is the initials of the name Pinyin displayed.

package com.example.sortlistview;
 
public class SortModel {
 
	private String name;   //Displayed data
	private String sortLetters;  //Display the initials of the data Pinyin
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSortLetters() {
		return sortLetters;
	}
	public void setSortLetters(String sortLetters) {
		this.sortLetters = sortLetters;
	}
}

2. The SideBar class is the alphabetical index View on the right side of ListView. We need to use setTextView(TextView mTextDialog) to set the TextView to display the currently pressed letters, and setOn Touching Letter ChangedListener to set the callback interface to handle different operations in the callback method onTouching LetterChanged (String).

package com.example.sortlistview;
 
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.graphics.drawable.ColorDrawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;
 
public class SideBar extends View {
	// Touch event
    private OnTouchingLetterChangedListener onTouchingLetterChangedListener;
    // 26 letters
    public static String[] b = {"A", "B", "C", "D", "E", "F", "G", "H", "I",
            "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V",
            "W", "X", "Y", "Z"};
    private final int mNumber=26;//Total number of regular letters
    private int choose = -1;// Selection
    private Paint paint = new Paint();

    private TextView mTextDialog;

    private int textColor;
    private int textSize;
    private int textSelectorColor;

    private int mHeightPixels;

    public void setTextView(TextView mTextDialog) {
        this.mTextDialog = mTextDialog;
    }


    public SideBar(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        getWindowInfo(context);
        TypedArray a = context.obtainStyledAttributes(attrs,
                R.styleable.SideBar);
        textColor = a.getColor(R.styleable.SideBar_sbTextColor, Color.BLACK);
        textSize = a.getDimensionPixelSize(R.styleable.SideBar_sbTextSize, 24);
        textSelectorColor = a.getColor(R.styleable.SideBar_sbSelectedTextColor, Color.BLACK);
    }

    public SideBar(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
        getWindowInfo(context);
    }

    public SideBar(Context context) {
        super(context);
        getWindowInfo(context);
    }


    /**
     * Rewrite this method
     */
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // Get focus and change background color.
        int height = getHeight();// Acquire the corresponding height
        int width = getWidth(); // Get the corresponding width
        //int singleHeight = height / b.length; // Get the height of each letter
        int singleHeight = height / mNumber;// Get the height of each letter

        for (int i = 0; i < b.length; i++) {
            paint.setColor(textColor);
            // paint.setColor(Color.WHITE);
            paint.setTypeface(Typeface.DEFAULT_BOLD);
            paint.setAntiAlias(true);
            paint.setTextSize(textSize);
            // Selected status
            if (i == choose) {
                paint.setColor(textSelectorColor);
                paint.setFakeBoldText(true);
            }
            // The x coordinate is equal to half the width of the middle-string.
            float xPos = width / 2 - paint.measureText(b[i]) / 2;
            //float yPos = singleHeight * i + singleHeight;
            //(Whole Height/2-Letter Height*Number of Letters/2)+Letter Height*Number of Letters+Letter Height*
            float yPos = (height/2-singleHeight*b.length/2)+singleHeight * i + singleHeight;//Draw the center relative to y coordinates
            canvas.drawText(b[i], xPos, yPos, paint);
            paint.reset();// Reset brush
        }

    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        final int action = event.getAction();
        final float y = event.getY();// Click on y coordinates
        final int oldChoose = choose;
        final OnTouchingLetterChangedListener listener = onTouchingLetterChangedListener;
//        Finally int c = int (y / getHeight ()* b. length); the ratio of // click y coordinates to total height * the length of array b equals the number of clicks in b.
        int height = getHeight();// Acquire the corresponding height
        int singleHeight = height / mNumber;// Get the height of each letter
        //                      Half the height of the pixel corresponding to half the alphabetic set of the entire screen pixel
        final int c = (int) ((y-mHeightPixels/2 + (mHeightPixels/mNumber*b.length/2)) / (singleHeight*b.length) * b.length);// The ratio of y coordinates to total height * the length of the array b equals the number of clicks in b.

        switch (action) {
            case MotionEvent.ACTION_UP:
                setBackgroundDrawable(new ColorDrawable(0x00000000));
                choose = -1;//
                invalidate();
                if (mTextDialog != null) {
                    mTextDialog.setVisibility(View.INVISIBLE);
                }
                break;

            default:
                setBackgroundResource(R.drawable.sidebar_background);
                if (oldChoose != c) {
                    if (c >= 0 && c < b.length) {
                        if (listener != null) {
                            listener.onTouchingLetterChanged(b[c]);
                        }
                        if (mTextDialog != null) {
                            mTextDialog.setText(b[c]);
                            mTextDialog.setVisibility(View.VISIBLE);
                        }

                        choose = c;
                        invalidate();
                    }
                }

                break;
        }
        return true;
    }

    /**
     * Method of disclosure
     *
     * @param onTouchingLetterChangedListener
     */
    public void setOnTouchingLetterChangedListener(
            OnTouchingLetterChangedListener onTouchingLetterChangedListener) {
        this.onTouchingLetterChangedListener = onTouchingLetterChangedListener;
    }

    /**
     * Interface
     *
     * @author coder
     */
    public interface OnTouchingLetterChangedListener {
        public void onTouchingLetterChanged(String s);
    }

    /**
     * Set up the corresponding alphabetical index of the data and redraw it
     * @param b
     */
    public void setLetter(String[] b){
        this.b=b;
        requestLayout();
        invalidate();
    }

    /**
     * Get screen information of the device
     *
     * @return
     */
    private void getWindowInfo(Context context) {
        // DisplayMetrics class for descriptive information on the screen
        DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
        // Getting screen pixel height px
        int height = displayMetrics.heightPixels;
        //Get the height of the status bar
        int result = 0;
        int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resourceId > 0) {
            result = context.getResources().getDimensionPixelSize(resourceId);
        }
        mHeightPixels=height-result-dip2px(context,48);//Control Height = Screen Height - Status Bar Height - Navigation Bar Height
    }

    /**
     * Change from dp unit to PX (pixel) according to the resolution of mobile phone
     */
    private static int dip2px(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }
 
}


3.CharacterParser is a class that converts Chinese characters into Pinyin. The Pinyin has no tone. This class is a singleton class. It defines three methods. In this demo, the getSelling(String chs) method is used to convert phrases into Pinyin.

package com.example.sortlistview;
 
/**
 * Java Conversion of Chinese Characters into Pinyin
 * 
 */
public class CharacterParser {
	private static int[] pyvalue = new int[] {-20319, -20317, -20304, -20295, -20292, -20283, -20265, -20257, -20242, -20230, -20051, -20036, -20032,
			-20026, -20002, -19990, -19986, -19982, -19976, -19805, -19784, -19775, -19774, -19763, -19756, -19751, -19746, -19741, -19739, -19728,
			-19725, -19715, -19540, -19531, -19525, -19515, -19500, -19484, -19479, -19467, -19289, -19288, -19281, -19275, -19270, -19263, -19261,
			-19249, -19243, -19242, -19238, -19235, -19227, -19224, -19218, -19212, -19038, -19023, -19018, -19006, -19003, -18996, -18977, -18961,
			-18952, -18783, -18774, -18773, -18763, -18756, -18741, -18735, -18731, -18722, -18710, -18697, -18696, -18526, -18518, -18501, -18490,
			-18478, -18463, -18448, -18447, -18446, -18239, -18237, -18231, -18220, -18211, -18201, -18184, -18183, -18181, -18012, -17997, -17988,
			-17970, -17964, -17961, -17950, -17947, -17931, -17928, -17922, -17759, -17752, -17733, -17730, -17721, -17703, -17701, -17697, -17692,
			-17683, -17676, -17496, -17487, -17482, -17468, -17454, -17433, -17427, -17417, -17202, -17185, -16983, -16970, -16942, -16915, -16733,
			-16708, -16706, -16689, -16664, -16657, -16647, -16474, -16470, -16465, -16459, -16452, -16448, -16433, -16429, -16427, -16423, -16419,
			-16412, -16407, -16403, -16401, -16393, -16220, -16216, -16212, -16205, -16202, -16187, -16180, -16171, -16169, -16158, -16155, -15959,
			-15958, -15944, -15933, -15920, -15915, -15903, -15889, -15878, -15707, -15701, -15681, -15667, -15661, -15659, -15652, -15640, -15631,
			-15625, -15454, -15448, -15436, -15435, -15419, -15416, -15408, -15394, -15385, -15377, -15375, -15369, -15363, -15362, -15183, -15180,
			-15165, -15158, -15153, -15150, -15149, -15144, -15143, -15141, -15140, -15139, -15128, -15121, -15119, -15117, -15110, -15109, -14941,
			-14937, -14933, -14930, -14929, -14928, -14926, -14922, -14921, -14914, -14908, -14902, -14894, -14889, -14882, -14873, -14871, -14857,
			-14678, -14674, -14670, -14668, -14663, -14654, -14645, -14630, -14594, -14429, -14407, -14399, -14384, -14379, -14368, -14355, -14353,
			-14345, -14170, -14159, -14151, -14149, -14145, -14140, -14137, -14135, -14125, -14123, -14122, -14112, -14109, -14099, -14097, -14094,
			-14092, -14090, -14087, -14083, -13917, -13914, -13910, -13907, -13906, -13905, -13896, -13894, -13878, -13870, -13859, -13847, -13831,
			-13658, -13611, -13601, -13406, -13404, -13400, -13398, -13395, -13391, -13387, -13383, -13367, -13359, -13356, -13343, -13340, -13329,
			-13326, -13318, -13147, -13138, -13120, -13107, -13096, -13095, -13091, -13076, -13068, -13063, -13060, -12888, -12875, -12871, -12860,
			-12858, -12852, -12849, -12838, -12831, -12829, -12812, -12802, -12607, -12597, -12594, -12585, -12556, -12359, -12346, -12320, -12300,
			-12120, -12099, -12089, -12074, -12067, -12058, -12039, -11867, -11861, -11847, -11831, -11798, -11781, -11604, -11589, -11536, -11358,
			-11340, -11339, -11324, -11303, -11097, -11077, -11067, -11055, -11052, -11045, -11041, -11038, -11024, -11020, -11019, -11018, -11014,
			-10838, -10832, -10815, -10800, -10790, -10780, -10764, -10587, -10544, -10533, -10519, -10331, -10329, -10328, -10322, -10315, -10309,
			-10307, -10296, -10281, -10274, -10270, -10262, -10260, -10256, -10254};
	public static String[] pystr = new String[] {"a", "ai", "an", "ang", "ao", "ba", "bai", "ban", "bang", "bao", "bei", "ben", "beng", "bi", "bian",
			"biao", "bie", "bin", "bing", "bo", "bu", "ca", "cai", "can", "cang", "cao", "ce", "ceng", "cha", "chai", "chan", "chang", "chao", "che",
			"chen", "cheng", "chi", "chong", "chou", "chu", "chuai", "chuan", "chuang", "chui", "chun", "chuo", "ci", "cong", "cou", "cu", "cuan",
			"cui", "cun", "cuo", "da", "dai", "dan", "dang", "dao", "de", "deng", "di", "dian", "diao", "die", "ding", "diu", "dong", "dou", "du",
			"duan", "dui", "dun", "duo", "e", "en", "er", "fa", "fan", "fang", "fei", "fen", "feng", "fo", "fou", "fu", "ga", "gai", "gan", "gang",
			"gao", "ge", "gei", "gen", "geng", "gong", "gou", "gu", "gua", "guai", "guan", "guang", "gui", "gun", "guo", "ha", "hai", "han", "hang",
			"hao", "he", "hei", "hen", "heng", "hong", "hou", "hu", "hua", "huai", "huan", "huang", "hui", "hun", "huo", "ji", "jia", "jian",
			"jiang", "jiao", "jie", "jin", "jing", "jiong", "jiu", "ju", "juan", "jue", "jun", "ka", "kai", "kan", "kang", "kao", "ke", "ken",
			"keng", "kong", "kou", "ku", "kua", "kuai", "kuan", "kuang", "kui", "kun", "kuo", "la", "lai", "lan", "lang", "lao", "le", "lei", "leng",
			"li", "lia", "lian", "liang", "liao", "lie", "lin", "ling", "liu", "long", "lou", "lu", "lv", "luan", "lue", "lun", "luo", "ma", "mai",
			"man", "mang", "mao", "me", "mei", "men", "meng", "mi", "mian", "miao", "mie", "min", "ming", "miu", "mo", "mou", "mu", "na", "nai",
			"nan", "nang", "nao", "ne", "nei", "nen", "neng", "ni", "nian", "niang", "niao", "nie", "nin", "ning", "niu", "nong", "nu", "nv", "nuan",
			"nue", "nuo", "o", "ou", "pa", "pai", "pan", "pang", "pao", "pei", "pen", "peng", "pi", "pian", "piao", "pie", "pin", "ping", "po", "pu",
			"qi", "qia", "qian", "qiang", "qiao", "qie", "qin", "qing", "qiong", "qiu", "qu", "quan", "que", "qun", "ran", "rang", "rao", "re",
			"ren", "reng", "ri", "rong", "rou", "ru", "ruan", "rui", "run", "ruo", "sa", "sai", "san", "sang", "sao", "se", "sen", "seng", "sha",
			"shai", "shan", "shang", "shao", "she", "shen", "sheng", "shi", "shou", "shu", "shua", "shuai", "shuan", "shuang", "shui", "shun",
			"shuo", "si", "song", "sou", "su", "suan", "sui", "sun", "suo", "ta", "tai", "tan", "tang", "tao", "te", "teng", "ti", "tian", "tiao",
			"tie", "ting", "tong", "tou", "tu", "tuan", "tui", "tun", "tuo", "wa", "wai", "wan", "wang", "wei", "wen", "weng", "wo", "wu", "xi",
			"xia", "xian", "xiang", "xiao", "xie", "xin", "xing", "xiong", "xiu", "xu", "xuan", "xue", "xun", "ya", "yan", "yang", "yao", "ye", "yi",
			"yin", "ying", "yo", "yong", "you", "yu", "yuan", "yue", "yun", "za", "zai", "zan", "zang", "zao", "ze", "zei", "zen", "zeng", "zha",
			"zhai", "zhan", "zhang", "zhao", "zhe", "zhen", "zheng", "zhi", "zhong", "zhou", "zhu", "zhua", "zhuai", "zhuan", "zhuang", "zhui",
			"zhun", "zhuo", "zi", "zong", "zou", "zu", "zuan", "zui", "zun", "zuo"};
	private StringBuilder buffer;
	private String resource;
	private static CharacterParser characterParser = new CharacterParser();
 
	public static CharacterParser getInstance() {
		return characterParser;
	}
 
	public String getResource() {
		return resource;
	}
 
	public void setResource(String resource) {
		this.resource = resource;
	}
 
	/** * Conversion of Chinese Characters into ASCII Code* * @param chs* @return */
	private int getChsAscii(String chs) {
		int asc = 0;
		try {
			byte[] bytes = chs.getBytes("gb2312");
			if (bytes == null || bytes.length > 2 || bytes.length <= 0) {
				throw new RuntimeException("illegal resource string");
			}
			if (bytes.length == 1) {
				asc = bytes[0];
			}
			if (bytes.length == 2) {
				int hightByte = 256 + bytes[0];
				int lowByte = 256 + bytes[1];
				asc = (256 * hightByte + lowByte) - 256 * 256;
			}
		} catch (Exception e) {
			System.out.println("ERROR:ChineseSpelling.class-getChsAscii(String chs)" + e);
		}
		return asc;
	}
 
	/** * Word parsing * * @param str * @return */
	public String convert(String str) {
		String result = null;
		int ascii = getChsAscii(str);
		if (ascii > 0 && ascii < 160) {
			result = String.valueOf((char) ascii);
		} else {
			for (int i = (pyvalue.length - 1); i >= 0; i--) {
				if (pyvalue[i] <= ascii) {
					result = pystr[i];
					break;
				}
			}
		}
		return result;
	}
 
	/** * Phrase resolution * * @param chs * @return */
	public String getSelling(String chs) {
		String key, value;
		buffer = new StringBuilder();
		for (int i = 0; i < chs.length(); i++) {
			key = chs.substring(i, i + 1);
			if (key.getBytes().length >= 2) {
				value = (String) convert(key);
				if (value == null) {
					value = "unknown";
				}
			} else {
				value = key;
			}
			buffer.append(value);
		}
		//Judging City Polyphonic Characters
		if (chs.equals("Chongqing") || chs.equals("Changsha")||chs.equals("Changchun")) {
            return "C";
        }
		return buffer.toString();
	}
 
	public String getSpelling() {
		return this.getSelling(this.getResource());
	}
 
}


4. The ClearEditText class is a self-defined EditText with deleted pictures on the right. Of course, you can also use Android's native EditText. As I mentioned before, I will not attach the code to the ClearEditText input box control with clearance function, which imitates the input box of IOS.

5.SortAdapter data adapter class, which needs to implement SectionIndexer interface, which is used to control the ListView grouping. There are three methods of this interface: getSectionForPosition(int position), getPositionForSection(int section), getSections(). We only need to implement the first two methods by ourselves.

GetSection ForPosition (int position) is based on the position of ListView to get the ascii value of the initials char of the name above the position. For example, if the name above the position is A Mei and the initials are A, then this method returns the ascii value of the'A'letter, that is 65,'B' is 66, and so on.
getPositionForSection(int section) is based on the ascii value of the initial letter to get the position of the first occurrence of the initial letter in the ListView. For example, from the effect figure 1 above, if the section is 66, that is, the ascii value of'B', then the position returned by this method is 2.
Then there's the getView() method. First, we call getSectionForPosition(int position) based on the position of ListView to get the ascii value of the initials of the name above the location, and then call getPositionForSection(int section) based on the ascii value to get the position of the first occurrence of the initials, if the position of ListView equals to calling getFor Position based on the ascii value. Section (int section) to get the position of the first occurrence of the initials, displays the categorized letters or hides them

package com.example.sortlistview;
 
import java.util.List;
 
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.SectionIndexer;
import android.widget.TextView;
 
public class SortAdapter extends BaseAdapter implements SectionIndexer{
	private List<SortModel> list = null;
	private Context mContext;
	
	public SortAdapter(Context mContext, List<SortModel> list) {
		this.mContext = mContext;
		this.list = list;
	}
	
	/**
	 * When the ListView data changes, this method is called to update the ListView
	 * @param list
	 */
	public void updateListView(List<SortModel> list){
		this.list = list;
		notifyDataSetChanged();
	}
 
	public int getCount() {
		return this.list.size();
	}
 
	public Object getItem(int position) {
		return list.get(position);
	}
 
	public long getItemId(int position) {
		return position;
	}
 
	public View getView(final int position, View view, ViewGroup arg2) {
		ViewHolder viewHolder = null;
		final SortModel mContent = list.get(position);
		if (view == null) {
			viewHolder = new ViewHolder();
			view = LayoutInflater.from(mContext).inflate(R.layout.item, null);
			viewHolder.tvTitle = (TextView) view.findViewById(R.id.title);
			viewHolder.tvLetter = (TextView) view.findViewById(R.id.catalog);
			view.setTag(viewHolder);
		} else {
			viewHolder = (ViewHolder) view.getTag();
		}
		
		//Get the char ascii value of the first letter of the classification according to position
		int section = getSectionForPosition(position);
		
		//If the current position equals the position of Char in the first letter of the classification, it is considered to be the first occurrence.
		if(position == getPositionForSection(section)){
			viewHolder.tvLetter.setVisibility(View.VISIBLE);
			viewHolder.tvLetter.setText(mContent.getSortLetters());
		}else{
			viewHolder.tvLetter.setVisibility(View.GONE);
		}
	
		viewHolder.tvTitle.setText(this.list.get(position).getName());
		
		return view;
 
	}
	
 
 
	final static class ViewHolder {
		TextView tvLetter;
		TextView tvTitle;
	}
 
 
	/**
	 * Get the char ascii value of the first letter of the classification according to the current position of ListView
	 */
	public int getSectionForPosition(int position) {
		return list.get(position).getSortLetters().charAt(0);
	}
 
	/**
	 * Obtain the location of the first occurrence of the initial according to the Charascii value of the categorized initials
	 */
	public int getPositionForSection(int section) {
		for (int i = 0; i < getCount(); i++) {
			String sortStr = list.get(i).getSortLetters();
			char firstChar = sortStr.toUpperCase().charAt(0);
			if (firstChar == section) {
				return i;
			}
		}
		
		return -1;
	}
	
 
	@Override
	public Object[] getSections() {
		return null;
	}
}


6.MainActivity code is relatively simple. We set addTextChangedListener to ClearEditText. When the content of the input box changes, we filter ListView according to the value inside. The value inside is empty to display the original list. The PinyinComparator interface is used to sort the list data. The interface is mainly used to compare objects.

package com.example.sortlistview;
 
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
 
import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
 
import com.example.sortlistview.SideBar.OnTouchingLetterChangedListener;
 
public class MainActivity extends Activity {
	private ListView sortListView;
	private SideBar sideBar;
	/**
	 * TextView Displaying Letters
	 */
	private TextView dialog;
	private SortAdapter adapter;
	private ClearEditText mClearEditText;
	
	/**
	 * Classes of Chinese Characters Converted into Pinyin
	 */
	private CharacterParser characterParser;
	private List<SortModel> SourceDateList;
	
	/**
	 * Arrange the data classes in ListView according to Pinyin
	 */
	private PinyinComparator pinyinComparator;
 
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		initViews();
	}
 
	private void initViews() {
		//Instance of Chinese Character Transliteration
		characterParser = CharacterParser.getInstance();
		
		pinyinComparator = new PinyinComparator();
		
		sideBar = (SideBar) findViewById(R.id.sidrbar);
		dialog = (TextView) findViewById(R.id.dialog);
		sideBar.setTextView(dialog);
		
		//Setting right touch monitor
		sideBar.setOnTouchingLetterChangedListener(new OnTouchingLetterChangedListener() {
			
			@Override
			public void onTouchingLetterChanged(String s) {
				//The position where the letter first appeared
				int position = adapter.getPositionForSection(s.charAt(0));
				if(position != -1){
					sortListView.setSelection(position);
				}
				
			}
		});
		
		sortListView = (ListView) findViewById(R.id.country_lvcountry);
		sortListView.setOnItemClickListener(new OnItemClickListener() {
 
			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				//Here we use adapter.getItem(position) to get the object corresponding to the current position.
				Toast.makeText(getApplication(), ((SortModel)adapter.getItem(position)).getName(), Toast.LENGTH_SHORT).show();
			}
		});
		
		SourceDateList = filledData(getResources().getStringArray(R.array.date));
		
		// Sorting source data according to a-z
		Collections.sort(SourceDateList, pinyinComparator);
		adapter = new SortAdapter(this, SourceDateList);
		sortListView.setAdapter(adapter);
		
		
		mClearEditText = (ClearEditText) findViewById(R.id.filter_edit);
		
		//Filter searches based on changes in input values of input boxes
		mClearEditText.addTextChangedListener(new TextWatcher() {
			
			@Override
			public void onTextChanged(CharSequence s, int start, int before, int count) {
				//When the value in the input box is empty, update to the original list, otherwise filter the data list
				filterData(s.toString());
			}
			
			@Override
			public void beforeTextChanged(CharSequence s, int start, int count,
					int after) {
				
			}
			
			@Override
			public void afterTextChanged(Editable s) {
			}
		});
	}
 
 
	/**
	 * Fill in data for ListView
	 * @param date
	 * @return
	 */
	private List<SortModel> filledData(String [] date){
		List<SortModel> mSortList = new ArrayList<SortModel>();
		//Letter Map
        HashMap<String,String> hashMap=new HashMap<>();
		for(int i=0; i<date.length; i++){
			SortModel sortModel = new SortModel();
			sortModel.setName(date[i]);
			//Conversion of Chinese Characters into Pinyin
			String pinyin = characterParser.getSelling(date[i]);
			String sortString = pinyin.substring(0, 1).toUpperCase();
			
			// Regular expression, to determine whether the initials are English letters?
			if(sortString.matches("[A-Z]")){
				sortModel.setSortLetters(sortString.toUpperCase());
				hashMap.put(sortString.toUpperCase(),sortString.toUpperCase());
			}else{
				sortModel.setSortLetters("#");
				hashMap.put("#","#");
			}
			//Get a collection of letters with data
        List<String> mapKeyList = new ArrayList<>(hashMap.keySet());
        //Alphabetical order
        Collections.sort(mapKeyList);
        String[] strings = new String[mapKeyList.size()];
        //Convert the collection of letters into an array and redraw it
        sideBar.setLetter(mapKeyList.toArray(strings));
			mSortList.add(sortModel);
		}
		return mSortList;
		
	}
	
	/**
	 * Filter data and update ListView based on the values in the input box
	 * @param filterStr
	 */
	private void filterData(String filterStr) {
		List<SortModel> filterDateList = new ArrayList<SortModel>();
 
		if (TextUtils.isEmpty(filterStr)) {
			filterDateList = SourceDateList;
		} else {
			filterDateList.clear();
			for (SortModel sortModel : SourceDateList) {
				String name = sortModel.getName();
				if (name.toUpperCase().indexOf(
						filterStr.toString().toUpperCase()) != -1
						|| characterParser.getSelling(name).toUpperCase()
								.startsWith(filterStr.toString().toUpperCase())) {
					filterDateList.add(sortModel);
				}
			}
		}
		
		// Sort by a-z
		Collections.sort(filterDateList, pinyinComparator);
		adapter.updateListView(filterDateList);
	}
	
}


7. The PinyinComparator interface is used to sort the data in ListView according to A-Z. The first two if judgments are mainly to put the data that does not start with Chinese characters at the back.

package com.example.sortlistview;
 
import java.util.Comparator;
 
/**
 * 
 * @author xiaanming
 *
 */
public class PinyinComparator implements Comparator<SortModel> {
 
	public int compare(SortModel o1, SortModel o2) {
		//This is mainly used to sort the data in ListView according to ABCDEFG...
		if (o2.getSortLetters().equals("#")) {
			return -1;
		} else if (o1.getSortLetters().equals("#")) {
			return 1;
		} else {
			return o1.getSortLetters().compareTo(o2.getSortLetters());
		}
	}
}


So we will use A-Z sorting in the future without limitations, want to add this effect at any time, other layout and pictures and other documents will not be posted, if you are interested in downloading the code, if you have any questions, please leave a message below, I will answer for you!

Posted by mothermugger on Sun, 20 Jan 2019 11:42:14 -0800