实现效果:
自定义QiuckIndexBar 请参考:http://blog.csdn.net/qq_37936727/article/details/78304655
一、实现功能:
将自定义的QuickIndexBar设置点击事件实现快速检索,就是点击某个字母ListView 的中的数据就会对应到相应的拼音的首字母,显示该字母的联系人信息;
二、知识点:
【1】 第三方包中文转拼音的使用;
【2】 ListView的使用方法、适配器(adapter)的使用 ;
三、知识点解析:
1.第三方包中文转拼音的使用;
【1】 添加及方法介绍:
首先在build.gradle里Android下添加:
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
然后dependencies里添加:
compile 'com.github.SilenceDut:jpinyin:v1.0'
这个开源包有这三个方法:
String str = "你好世界";
PinyinHelper.convertToPinyinString(str, ",", PinyinFormat.WITH_TONE_MARK); // nǐ,hǎo,shì,jiè
PinyinHelper.convertToPinyinString(str, ",", PinyinFormat.WITH_TONE_NUMBER); // ni3,hao3,shi4,jie4
PinyinHelper.convertToPinyinString(str, ",", PinyinFormat.WITHOUT_TONE); // ni,hao,shi,jie
第一个是中文转换为拼音字母,第二个是中文转换为英文字母后加数字表示声调,第三个是只有英文字母;
具体参考:点击打开链接https://github.com/stuxuhai/jpinyin
【2】项目实现:
新建一个工具类,pinyinUtil.java ,将输入的数据进行符号、中文、英文字母 等的检索,如果是中文,那么先转换为英文字母,如果是符号,那么可直接显示,如果是小写英文,转化为大写的英文字母
public class PinyinUtil {
public static String getPinyin(String chinese) {
if (TextUtils.isEmpty(chinese)) return null;
char[] charArray = chinese.toCharArray();
String pinyin = "";
for (int i = 0; i < charArray.length; i++) {
//判断是否为空格
if (Character.isWhitespace(charArray[i])) continue;
//判断是否为汉字,因为汉字占2个字节,一般是-128到127 ,其外的一般是可硬从键盘输入的字母以及符号;
//当字母为小写字母的时候,转为大写字母;
if (charArray[i] > 127||charArray[i] >= 97 && charArray[i] <= 122) {
try {
//因为第三方包只提供转换为小写英文,所以这里用toUpperCase()方法将他转为大写
String arr = PinyinHelper.convertToPinyinString(String.valueOf(charArray[i]), "", PinyinFormat.WITH_TONE_NUMBER).toUpperCase();
char[] array = arr.toCharArray();
if (array != null) {
pinyin += array[0];
} else {
//不需要其他操作
}
} catch (PinyinException e) {
e.printStackTrace();
}
} else {
pinyin += charArray[i];
}
}
return pinyin;
}
好了,所需要的中文转拼音的工具类已经准备好了;
2.ListView 的使用方法:
[ 1 ] 需要用到的文件:
a. 一个填充数据的Java bean ;
b. 一个ListView的子布局;
c. 一个适配器;
[ 2 ] 实现过程:
a.定义一个Java bean 用于数据的填充,新建一个Friend.java,这里我们继承一个Comparable来实现数据排序;
import android.support.annotation.NonNull;
import com.xc.quickindexbar.util.PinyinUtil;
import java.util.Comparator;
public class Friend implements Comparable<Friend> {
private String name;
private String pinyin;
public Friend(String name) {
this.name = name;
//优化内存,因为PinyinUtil类的方法在加载的术后会被频繁调用,所以先加载好PinyinUtil方法
setPinyin(PinyinUtil.getPinyin(name));
}
public String getPinyin() {
return pinyin;
}
public void setPinyin(String pinyin) {
this.pinyin = pinyin;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int compareTo(@NonNull Friend o) {
return getPinyin().compareTo(o.getPinyin());
}
}
b.创建ListView 的子布局 list_view_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/index_word"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#e1dede"
android:paddingLeft="10dp"
android:text="A"
android:textSize="18sp" />
<TextView
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="18sp"
android:padding="10dp"
android:textColor="#000"
android:text="名字"/>
<View
android:layout_width="match_parent"
android:layout_height="0.3dp"
android:layout_marginLeft="15dp"
android:background="#e6e5e5"/>
</LinearLayout>
c.创建适配器MyAdapter.java 继承BaseAdapter
public class MyAdapter extends BaseAdapter {
List<Friend> lists;
private Context mContext;
public MyAdapter(Context context,List<Friend> lists) {
this.lists=lists;
this.mContext=context;
}
@Override
public int getCount() {
return lists.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView==null){
convertView=View.inflate(mContext,R.layout.list_view_item,null);
}
ViewHolder holder=ViewHolder.getViewHolder(convertView);
//设置数据
Friend friend=lists.get(position);
holder.name.setText(friend.getName());
// holder.word.setText(friend.getPinyin());
String currentWord=friend.getPinyin().charAt(0)+"";
// Log.e("tag",currentWord);
if (position>0){
String lastWord=lists.get(position-1).getPinyin().charAt(0)+"";
if (currentWord.equals(lastWord)){
holder.word.setVisibility(View.GONE);
}else {
holder.word.setVisibility(View.VISIBLE);
holder.word.setText(currentWord);
}
}else {
holder.word.setVisibility(View.VISIBLE);
holder.word.setText(currentWord);
}
return convertView;
}
/**
* 封装方法,使得代码简洁点
*/
static class ViewHolder{
TextView word;
TextView name;
public ViewHolder(View view){
word= (TextView) view.findViewById(R.id.index_word);
name= (TextView) view.findViewById(R.id.name);
}
static ViewHolder getViewHolder(View view){
ViewHolder holder= (ViewHolder) view.getTag();
if (holder==null){
holder=new ViewHolder(view);
view.setTag(holder);
}
return holder;
}
}
}
因为创建出来就会一个名字就会有一个英文字母对应,会变为一条一条的显示,所以要让上一个名字和下一个名字的首字母相比较,如果相同就隐藏显示字母的TextView ;
四、完成自定义QiuckIndexBar的检索;
在MainActivity里实现控件的功能;
public class MainActivity extends AppCompatActivity implements QuickIndexBar.OnTouchLetterListener, AdapterView.OnItemClickListener {
private List<Friend> mLists = new ArrayList<>();
private ListView listView;
private QuickIndexBar indexBar;
private TextView showWord;
private Handler handler = new Handler();
boolean isClick = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//加载布局和ListView适配
initView();
//添加点击事件
indexBar.setOnTouchLetterListener(this);
listView.setOnItemClickListener(this);
}
/**
* 加载布局和ListView适配
*/
private void initView() {
indexBar = (QuickIndexBar) findViewById(R.id.indexBar);
listView = (ListView) findViewById(R.id.list_view);
showWord = (TextView) findViewById(R.id.show_word);
//加载数据
initData();
//对集合排序
Collections.sort(mLists);
//添加适配器
listView.setAdapter(new MyAdapter(this, mLists));
}
/**
* 显示隐藏的listView,相当于一个Toast,但比Toast简单
* @param letter indexBar的字母
*/
private void showWordView(String letter) {
showWord.setVisibility(View.VISIBLE);
showWord.setText(letter);
//在开始之前一处事件
handler.removeCallbacksAndMessages(null);
handler.postDelayed(new Runnable() {
@Override
public void run() {
showWord.setVisibility(View.GONE);
}
}, 2000);
}
/**
* 给List添加数据
*/
private void initData() {
mLists.add(new Friend("狗子"));
mLists.add(new Friend("张三"));
mLists.add(new Friend("阿三"));
mLists.add(new Friend("阿四"));
mLists.add(new Friend("蜘蛛侠"));
mLists.add(new Friend("成龙"));
mLists.add(new Friend("钢铁侠"));
mLists.add(new Friend("周杰伦"));
mLists.add(new Friend("林俊杰1"));
mLists.add(new Friend("baby"));
mLists.add(new Friend("王思聪"));
mLists.add(new Friend("a林俊杰a"));
mLists.add(new Friend("张四"));
mLists.add(new Friend("林俊杰"));
mLists.add(new Friend("王尼玛2"));
mLists.add(new Friend("王尼玛"));
mLists.add(new Friend("赵子龙"));
mLists.add(new Friend("杨洋"));
mLists.add(new Friend("赵子龙"));
mLists.add(new Friend("杨树"));
mLists.add(new Friend("李小龙"));
mLists.add(new Friend("送人头"));
mLists.add(new Friend("李青"));
mLists.add(new Friend("安妮"));
mLists.add(new Friend("O(∩_∩)O~哒"));
}
/**
* 实现indexBar的点击事件
* @param letter indexBar的字母
*/
@Override
public void TouchLetter(String letter) {
// Log.e("index","index ="+letter);
for (int i = 0; i < mLists.size(); i++) {
String currentLetter = mLists.get(i).getPinyin().charAt(0) + "";
// Log.e("tag", letter);
if (isClick == true) {
showWord.setTextSize(50);
}
if (letter.equals(currentLetter)) {
listView.setSelection(i);
// Toast.makeText(getApplication(),currentLetter,Toast.LENGTH_SHORT).show();
showWordView(letter);
break;
} else {
showWordView(letter);
}
}
}
/**
*
* 实现listView的点击事件
* @param parent
* @param view
* @param position listView的子项参数从0开始
* @param id
*/
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Friend friend = mLists.get(position);
showWord.setTextSize(16);
showWordView(friend.getName());
isClick = !isClick;
}
}
ListView是很常用的一个控件,虽说功能效果没有REcyclerView好用,但是一些基础的东西用ListView来实现也是比较便利,不需要倒包/compile,比较适合初学者,所以整个快速检索的小项目已经完成,学习的知识进行整理也是一个复习的过程,作为一个刚学不就的初学者,希望这篇文章能帮助到初学Android的朋友,一起成长 。