字母条索引定位
返回一个int值,W。
pinyin= + pinyin + ];}/** * 此接口强行对实现它的每个类的对象进行整体排序。
则返回值0; ** 如当前对象=o对象,类的 compareTo 方法被称为它的自然比较方法 ,进行下次遍历//汉字是2个字节存储, 不显示首字母Viewholder.index.setVisibility(View.GONE);} else {// 否则, 0, M,是否带音标format.setCaseType(HanyuPinyinCaseType.UPPERCASE);//大写format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);//由于不能直接对多个汉字转换。
int heightMeasureSpec) {super.onMeasure(widthMeasureSpec,J。
0, rect);paint.getTextBounds(indexArr[i], L, 1,只能对单个汉字转换char[] arr = hanzi.toCharArray();for (int i = 0; i arr.length; i++) {if(Character.isWhitespace(arr[i]))continue;//如果是空格, attrs);// 初始化paintpaint = new Paint();paint.setAntiAlias(true);// 抗据齿}private Paint paint;// 字母的宽、高private int cellWidth;private int cellHeight;private int touchIndex = -1;// 字体选中、非选中大小private int textSize;private int textTouchSize;private String[] indexArr = { A, U, format);if(pinyinArr!=null){pinyin += pinyinArr[0];}else {pinyin += arr[i];}} catch (BadHanyuPinyinOutputFormatCombination e) {e.printStackTrace();//不是正确的汉字pinyin += arr[i];}}else {//不是汉字。
pinyin += arr[i];}}return pinyin;}} ,R.layout.item_friend, I, T, R。
name;}}} QuickIndexBarpackage com.atguigu.quickindex;import android.annotation.SuppressLint;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Rect;import android.graphics.Typeface;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;/** * 自定义快速索引的View */public class QuickIndexBar extends View {public QuickIndexBar(Context context, K, P。
Y, heightMeasureSpec);cellWidth = this.getMeasuredWidth();cellHeight = this.getMeasuredHeight() / indexArr.length;textSize = cellHeight - 5;textTouchSize = cellHeight + 5;}@SuppressLint(DrawAllocation)@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);for (int i = 0; i indexArr.length; i++) {// 字母的字体大小paint.setTextSize(i == touchIndex ? textTouchSize : textSize);// 字母的字体颜色paint.setColor(i == touchIndex ? Color.parseColor(#666666): Color.WHITE);// 计算字母显示的宽高Rect bounds = new Rect();//paint.getTextBounds(str, View convertView,则返回值0; */Collections.sort(friends);}/** * adapter */class FriendAdapter extends BaseAdapter {@Overridepublic int getCount() {return friends.size();}@Overridepublic Object getItem(int position) {return friends.get(position);}@Overridepublic long getItemId(int position) {return 0;}@Overridepublic View getView(int position, ** 如当前对象o对象, E, Z };@Overrideprotected void onMeasure(int widthMeasureSpec, paint);}}@Overridepublic boolean onTouchEvent(MotionEvent event) {// 相对于当前View的事件y坐标int y = (int) event.getY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:case MotionEvent.ACTION_MOVE:// 如果没有在当前字母的区域内, 显示holder.index.setVisibility(View.VISIBLE);}}holder.index.setText(firstWord);holder.name.setText(friend.getName());return convertView;}class ViewHolder {TextView index, X。
G,则不处理, H, str.length(),所以大于127就可以当为汉字转换if(arr[i]127){try {//由于多音字的存在, bounds);int width = bounds.width();int height = bounds.height();// 计算字母绘制的坐标float x = cellWidth / 2 - width / 2;float y = i * cellHeight + cellHeight / 2 + height / 2;// 绘制字母文本canvas.drawText(indexArr[i],则返回值=0; ** 如当前对象o对象, 调用监听器的回调方法if (onTouchIndexChange != null) {onTouchIndexChange.onChange(indexArr[touchIndex]);}}break;case MotionEvent.ACTION_UP:touchIndex = -1;// 强制重绘invalidate();break;default:break;}return true;}private OnTouchIndexChange onTouchIndexChange;public void setOnTouchIndexChange(OnTouchIndexChange onTouchIndexChange) {this.onTouchIndexChange = onTouchIndexChange;}public interface OnTouchIndexChange {public void onChange(String word);}} Friendpackage com.atguigu.quickindex;/** * 好友信息对象 */public class Friend implements ComparableFriend {private String name;//姓名private String pinyin;//姓名对应的拼音public Friend(String name) {super();this.name = name;//通过名字得到对应的拼音this.pinyin = PinYinUtils.getPinYin(name);}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPinyin() {return pinyin;}public void setPinyin(String pinyin) {this.pinyin = pinyin;}@Overridepublic String toString() {return Friend [name= + name + ,单 dan shanString[] pinyinArr = PinyinHelper.toHanyuPinyinStringArray(arr[i], F, 2000);}private void initData() {// 虚拟数据friends.add(new Friend(张晓飞));friends.add(new Friend(杨光福));friends.add(new Friend(胡继群));friends.add(new Friend(刘畅));friends.add(new Friend(钟泽兴));friends.add(new Friend(尹革新));friends.add(new Friend(安传鑫));friends.add(new Friend(张骞壬));friends.add(new Friend(温松));friends.add(new Friend(李凤秋));friends.add(new Friend(刘甫));friends.add(new Friend(娄全超));friends.add(new Friend(张猛));friends.add(new Friend(王英杰));friends.add(new Friend(李振南));friends.add(new Friend(孙仁政));friends.add(new Friend(唐春雷));friends.add(new Friend(牛鹏伟));friends.add(new Friend(姜宇航));friends.add(new Friend(刘挺));friends.add(new Friend(张洪瑞));friends.add(new Friend(张建忠));friends.add(new Friend(侯亚帅));friends.add(new Friend(刘帅));friends.add(new Friend(乔竞飞));friends.add(new Friend(徐雨健));friends.add(new Friend(吴亮));friends.add(new Friend(王兆霖));friends.add(new Friend(阿三));friends.add(new Friend(二毛));/** * Comparable,这个接口只有一个方法comparableTo(Object o) ** 其规则是当前对象与o对象进行比较, 显示首字母Viewholder.index.setVisibility(View.VISIBLE);} else {// 如果不是第一个// 上一项的拼音首字母String preFirstWord = friends.get(position - 1).getPinyin().charAt(0)+ ;if (firstWord.equals(preFirstWord)) {// 如果当前的与上一个相同,可以让自定义对象实现一个Comparable接口, x。
y,系统根据此值进行排序。
S, B, N, D, activity_main.xml RelativeLayout xmlns:android=android:layout_width=match_parentandroid:layout_height=match_parentListViewandroid:id=@+id/listviewandroid:layout_width=match_parentandroid:layout_height=match_parent /ListViewcom.atguigu.quickindex.QuickIndexBarandroid:id=@+id/qucikIndexBarandroid:layout_width=35dpandroid:layout_height=match_parentandroid:layout_alignParentRight=trueandroid:background=#CFCFCF /TextViewandroid:id=@+id/currentIndexandroid:layout_width=120dpandroid:layout_height=105dpandroid:layout_centerInParent=trueandroid:background=@drawable/bg_indexandroid:gravity=centerandroid:text=Aandroid:textColor=#ffffffandroid:textSize=30spandroid:visibility=gone //RelativeLayout item_friend.xml?xml version=1.0 encoding=utf-8?LinearLayout xmlns:android=android:layout_width=match_parentandroid:layout_height=wrap_contentandroid:orientation=vertical TextViewandroid:id=@+id/indexandroid:layout_width=match_parentandroid:layout_height=wrap_contentandroid:paddingTop=5dpandroid:paddingBottom=5dpandroid:paddingLeft=10dpandroid:text=Aandroid:textColor=#ffffffandroid:background=#666666android:textSize=18sp/TextViewandroid:id=@+id/nameandroid:layout_height=wrap_contentandroid:layout_width=match_parentandroid:padding=10dpandroid:text=adasdandroid:textColor=#666666android:textSize=20sp//LinearLayout MainActivitypackage com.atguigu.quickindex;import java.util.ArrayList;import java.util.Collections;import java.util.List;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ListView;import android.widget.TextView;import com.atguigu.quickindex.QuickIndexBar.OnTouchIndexChange;public class MainActivity extends Activity {private ListView listView;private QuickIndexBar qucikIndexBar;private TextView currentIndex;// 数据集合private ListFriend friends = new ArrayListFriend();// 适配器private FriendAdapter adapter;private Handler handler = new Handler();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 加载主布局setContentView(R.layout.activity_main);// 初始化控件init();}private void init() {/** 初始化布局视图 */listView = (ListView) findViewById(R.id.listview);qucikIndexBar = (QuickIndexBar) findViewById(R.id.qucikIndexBar);currentIndex = (TextView) findViewById(R.id.currentIndex);/** 初始化数据 */initData();// 创建适配器adapter = new FriendAdapter();// 设置适配器listView.setAdapter(adapter);// 设置触摸的字母变化的监听qucikIndexBar.setOnTouchIndexChange(new OnTouchIndexChange() {@Overridepublic void onChange(String word) {// word为当前触摸的字母// 显示当前触摸的字母showInexWord(word);// 使用列表定位到对应的列表项locationWord(word);}});}private void locationWord(String word) {for (int i = 0; i friends.size(); i++) {//名字首字母String firstWord = friends.get(i).getPinyin().charAt(0) + ;if (firstWord.equals(word)) {//定位到item的位置listView.setSelection(i);return;}}}private void showInexWord(String word) {currentIndex.setVisibility(View.VISIBLE);currentIndex.setText(word);//停掉所用handler的消息, Q, */@Overridepublic int compareTo(Friend another) {return pinyin.compareTo(another.getPinyin());}} PinYinUtilspackage com.atguigu.quickindex;import net.sourceforge.pinyin4j.PinyinHelper;import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;/** * 将汉字转换为拼音 */public class PinYinUtils {/** * 得到指定汉字的拼音 * 注意:不应该被频繁调用, AttributeSet attrs) {super(context。
肯定大于127, null);holder = new ViewHolder();holder.index = (TextView) convertView.findViewById(R.id.index);holder.name = (TextView) convertView.findViewById(R.id.name);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}Friend friend = friends.get(position);String firstWord = friend.getPinyin().charAt(0) + ;// 得到拼音首字母if (position == 0) {// 如果是第一个。
C,此排序被称为该类的自然排序 , ViewGroup parent) {ViewHolder holder = null;if (convertView == null) {convertView = View.inflate(getApplicationContext(),防止内存泄露handler.removeCallbacksAndMessages(null);//2秒的定时器handler.postDelayed(new Runnable() {@Overridepublic void run() {currentIndex.setVisibility(View.GONE);}}, V, O, 就需要更新touchIndex,它消耗一定内存 */public static String getPinYin(String hanzi){String pinyin = ;HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();//控制转换是否大小写, 并重绘int index = y / cellHeight;if (index != touchIndex) {touchIndex = index;if (touchIndex = indexArr.length)touchIndex = indexArr.length - 1;// 强制重绘invalidate();// 如果有监听器,。
相关热词:
本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!
本文地址: https://www.juheyunku.com/jiaob/android/9909.shtml
相关文章
热门TAG
命令 权重 外链 企业网站 白帽 php 织梦教程 dedecms修改内容 javascript 织梦 功能 标签 调用 详解 服务器 网站流量 实例解析 Dedecms 织梦cms HTML tags标签 python jquery教程 jquery windows SEO优化 蜘蛛 搜索引擎 网站收录 JSP最新文章
-
Android开发_深入学习ViewP
时间:2020-12-27
-
Android Binder进程间通信 J
时间:2020-12-27
-
50个Android开发技巧11 为文
时间:2020-12-27
-
处女男学Android(十二)
时间:2020-12-27
-
手把手教你用ViewPager自定
时间:2020-12-27
-
字母条索引定位
时间:2020-12-27
-
OGEngine教程:声音加载
时间:2020-12-27
-
Notification详解
时间:2020-12-27
热门文章
-
字母条索引定位
时间:2020-12-27
-
Notification详解
时间:2020-12-27
-
OGEngine教程:声音加载
时间:2020-12-27
-
处女男学Android(十二) Android菜单(Men
时间:2020-12-27
-
Android Binder进程间通信 Java接口源代码
时间:2020-12-27
-
50个Android开发技巧11 为文字添加特效
时间:2020-12-27
-
Android开发_深入学习ViewPager控件
时间:2020-12-27
-
手把手教你用ViewPager自定义实现Banner轮播
时间:2020-12-27
