首页

Android 实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音

java

2020-8-18

Android 实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音


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;
	private TextView dialog;
	private SortAdapter adapter;
	private ClearEditText mClearEditText;
	
	/**
	 * 汉字转换成拼音的类
	 */
	private CharacterParser characterParser;
	private List<SortModel> SourceDateList;
	
	/**
	 * 根据拼音来排列ListView里面的数据类
	 */
	private PinyinComparator pinyinComparator;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		initViews();
	}

	private void initViews() {
		//实例化汉字转拼音类
		characterParser = CharacterParser.getInstance();
		
		pinyinComparator = new PinyinComparator();
		
		sideBar = (SideBar) findViewById(R.id.sidrbar);
		dialog = (TextView) findViewById(R.id.dialog);
		sideBar.setTextView(dialog);
		
		//设置右侧触摸监听
		sideBar.setOnTouchingLetterChangedListener(new OnTouchingLetterChangedListener() {
			
			@Override
			public void onTouchingLetterChanged(String s) {
				//该字母首次出现的位置
				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) {
				//这里要利用adapter.getItem(position)来获取当前position所对应的对象
				Toast.makeText(getApplication(), ((SortModel)adapter.getItem(position)).getName(), Toast.LENGTH_SHORT).show();
			}
		});
		
		SourceDateList = filledData(getResources().getStringArray(R.array.date));
		
		// 根据a-z进行排序源数据
		Collections.sort(SourceDateList, pinyinComparator);
		adapter = new SortAdapter(this, SourceDateList);
		sortListView.setAdapter(adapter);
		
		
		mClearEditText = (ClearEditText) findViewById(R.id.filter_edit);
		
		//根据输入框输入值的改变来过滤搜索
		mClearEditText.addTextChangedListener(new TextWatcher() {
			
			@Override
			public void onTextChanged(CharSequence s, int start, int before, int count) {
				//当输入框里面的值为空,更新为原来的列表,否则为过滤数据列表
				filterData(s.toString());
			}
			
			@Override
			public void beforeTextChanged(CharSequence s, int start, int count,
					int after) {
				
			}
			
			@Override
			public void afterTextChanged(Editable s) {
			}
		});
	}


	/**
	 * 为ListView填充数据
	 * @param date
	 * @return
	 */
	private List<SortModel> filledData(String [] date){
		List<SortModel> mSortList = new ArrayList<SortModel>();
		
		for(int i=0; i<date.length; i  ){
			SortModel sortModel = new SortModel();
			sortModel.setName(date[i]);
			//汉字转换成拼音
			String pinyin = characterParser.getSelling(date[i]);
			String sortString = pinyin.substring(0, 1).toUpperCase();
			
			// 正则表达式,判断首字母是否是英文字母
			if(sortString.matches("[A-Z]")){
				sortModel.setSortLetters(sortString.toUpperCase());
			}else{
				sortModel.setSortLetters("#");
			}
			
			mSortList.add(sortModel);
		}
		return mSortList;
		
	}
	
	/**
	 * 根据输入框中的值来过滤数据并更新ListView
	 * @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.indexOf(filterStr.toString()) != -1 || characterParser.getSelling(name).startsWith(filterStr.toString())){
					filterDateList.add(sortModel);
				}
			}
		}
		
		// 根据a-z进行排序
		Collections.sort(filterDateList, pinyinComparator);
		adapter.updateListView(filterDateList);
	}
	
}
资源下载此资源下载价格为2D币(VIP免费),请先
资源文件列表
.project , 848
.settings/org.eclipse.jdt.core.prefs , 177
AndroidManifest.xml , 942
bin/AndroidManifest.xml , 942
bin/classes.dex , 471436
bin/classes/com/example/sortlistview/BuildConfig.class , 357
bin/classes/com/example/sortlistview/CharacterParser.class , 12672
bin/classes/com/example/sortlistview/ClearEditText.class , 4192
bin/classes/com/example/sortlistview/MainActivity$1.class , 1333
bin/classes/com/example/sortlistview/MainActivity$2.class , 1669
bin/classes/com/example/sortlistview/MainActivity$3.class , 1234
bin/classes/com/example/sortlistview/MainActivity.class , 5378
bin/classes/com/example/sortlistview/PinyinComparator.class , 1107
bin/classes/com/example/sortlistview/R$array.class , 409
bin/classes/com/example/sortlistview/R$attr.class , 358
bin/classes/com/example/sortlistview/R$drawable.class , 750
bin/classes/com/example/sortlistview/R$id.class , 606
bin/classes/com/example/sortlistview/R$layout.class , 449
bin/classes/com/example/sortlistview/R$menu.class , 415
bin/classes/com/example/sortlistview/R$string.class , 488
bin/classes/com/example/sortlistview/R$style.class , 449
bin/classes/com/example/sortlistview/R.class , 733
bin/classes/com/example/sortlistview/SideBar$OnTouchingLetterChangedListener.class , 313
bin/classes/com/example/sortlistview/SideBar.class , 4207
bin/classes/com/example/sortlistview/SortAdapter$ViewHolder.class , 481
bin/classes/com/example/sortlistview/SortAdapter.class , 3644
bin/classes/com/example/sortlistview/SortModel.class , 755
bin/dexedLibs/android-support-v4-c0b27c86b819efc13636c97e5096b2bf.jar , 149766
bin/dexedLibs/android-support-v4-e0b48c22eb0810b27455e66d4308c0f6.jar , 149766
bin/jarlist.cache , 119
bin/MainActivity.apk , 203402
bin/resources.ap_ , 38750
bin/res/drawable-hdpi/emotionstore_progresscancelbtn.png , 1058
bin/res/drawable-hdpi/ic_launcher.png , 6299
bin/res/drawable-hdpi/search_bar_icon_normal.png , 598
bin/res/drawable-hdpi/show_head_toast_bg.9.PNG , 2064
bin/res/drawable-ldpi/ic_launcher.png , 2171
bin/res/drawable-mdpi/ic_launcher.png , 3296
bin/res/drawable-xhdpi/ic_launcher.png , 10087
bin/SortListView.apk , 192420
gen/com/example/sortlistview/BuildConfig.java , 166
gen/com/example/sortlistview/R.java , 3007
ic_launcher-web.png , 55743
libs/android-support-v4.jar , 385685
proguard-project.txt , 781
project.properties , 563
res/drawable-hdpi/emotionstore_progresscancelbtn.png , 1058
res/drawable-hdpi/ic_launcher.png , 8217
res/drawable-hdpi/search_bar_edit_normal.9.png , 1801
res/drawable-hdpi/search_bar_edit_pressed.9.png , 1935
res/drawable-hdpi/search_bar_icon_normal.png , 598
res/drawable-hdpi/show_head_toast_bg.9.PNG , 3549
res/drawable-ldpi/ic_launcher.png , 2557
res/drawable-mdpi/ic_launcher.png , 4062
res/drawable-xhdpi/ic_launcher.png , 13563
res/drawable/search_bar_edit_selector.xml , 395
res/drawable/sidebar_background.xml , 353
res/layout/activity_main.xml , 1752
res/layout/item.xml , 1134
res/menu/activity_main.xml , 257
res/values-v11/styles.xml , 332
res/values-v14/styles.xml , 389
res/values/arrays.xml , 1442
res/values/strings.xml , 225
res/values/styles.xml , 695
src/com/example/sortlistview/CharacterParser.java , 8463
src/com/example/sortlistview/ClearEditText.java , 4317
src/com/example/sortlistview/MainActivity.java , 4534
src/com/example/sortlistview/PinyinComparator.java , 518
src/com/example/sortlistview/SideBar.java , 3542
src/com/example/sortlistview/SortAdapter.java , 2996
src/com/example/sortlistview/SortModel.java , 425
没有账号? 忘记密码?

社交账号快速登录