package com.uliang.txl; import android.Manifest; import android.app.AlertDialog; import android.app.Dialog; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.provider.Settings; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.AdapterView; import android.widget.Button; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import com.google.gson.Gson; import com.google.gson.JsonSyntaxException; import com.google.gson.reflect.TypeToken; import com.uliang.R; import com.uliang.activity.BaseActivity; import com.uliang.an.MyEvent; import com.uliang.bean.BaseBean; import com.uliang.bean.CompanyInfo; import com.uliang.bean.JiaMiBean; import com.uliang.bean.MsgBean; import com.uliang.bean.NumberListBean; import com.uliang.bean.SortModel; import com.uliang.bean.TWX; import com.uliang.bean.Tongxunlu; import com.uliang.bean.TxuExist; import com.uliang.home.UserDetailActivity; import com.uliang.utils.AES; import com.uliang.utils.Const; import com.uliang.utils.Constants; import com.uliang.utils.PhoneContact; import com.uliang.utils.PinYinKit; import com.uliang.utils.PinyinComparator; import com.uliang.utils.SharedPreferencesUtil; import com.uliang.utils.StringUtils; import com.uliang.utils.ULiangHttp; import com.uliang.utils.ULiangUtil; import com.uliang.view.MyTitleView; import com.uliang.view.tongxunlu.SearchEditText; import com.uliang.view.tongxunlu.SideBar; import com.umeng.analytics.MobclickAgent; import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.xutils.http.RequestParams; import java.util.ArrayList; import java.util.Collections; import java.util.List; import de.greenrobot.event.EventBus; /** * Created by zhangqingbo on 16/4/18. */ public class TongxunluActivity extends BaseActivity implements View.OnClickListener { private final int URL_HOME_ADD_GUANZHU = 5; private MyTitleView titleview; private String user_id; private SideBar sideBar; private TextView dialogTxt; private ListView sortListView; private SortAddAdapter adapter; private String userListNumStr; private List<SortModel> sortModelList = new ArrayList<>(); private List<SortModel> des_list = new ArrayList<>(); private StringBuffer sb = new StringBuffer(); /** * 网络参数 */ private final int URL_TXL_LIST = 1; //添加到通讯录 private final int URL_TXL_LIST_ADD = 2; //添加到通讯录 private final int URL_TXL_LIST_DELETE = 3; public PinyinComparator comparator = new PinyinComparator(); private List<Tongxunlu> tongxulus; private SearchEditText mSearchEditText; private String message = ""; private boolean mboolean = false; private String encryptNoDes; private String encode; @Override protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.tongxunlu_add); super.onCreate(savedInstanceState); } @Override public void initView() { super.initView(); EventBus.getDefault().registerSticky(context); titleview = (MyTitleView) findViewById(R.id.titleview); titleview.getTv_title().setText("手机通讯录"); titleview.getBack().setOnClickListener(this); sideBar = (SideBar) findViewById(R.id.sild_bar); dialogTxt = (TextView) findViewById(R.id.txt_dialog); sideBar.setmTextDialog(dialogTxt); // on touching listener of side bar sideBar.setOnTouchingLetterChangedListener(new SideBar.OnTouchingLetterChangedListener() { public void onTouchingLetterChanged(String str) { int position = adapter.getPositionForSection(str.charAt(0)); if (position != -1) sortListView.setSelection(position); } }); sortListView = (ListView) findViewById(R.id.list_view_user_list); sortListView.setSelector(new ColorDrawable(Color.TRANSPARENT)); //设置长按监听事件 // sortListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { // @Override // public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { delete_tongxunlu(sortModelList.get(position).getId()); // Intent intent = new Intent(context,TxlDeleteMenuActivity.class); // startActivity(intent); // return false; // } // }); // sortListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { // @Override // public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // Intent intent = new Intent(context,UserDetailActivity.class); // intent.putExtra("twoUserId",tongxulus.get(position).getUser_id()); // context.startActivity(intent); // } // }); // View headView = LayoutInflater.from(context).inflate( // R.layout.txl_header2, null); // // sortListView.addHeaderView(headView); //设置搜索框 // search mSearchEditText = (SearchEditText) findViewById(R.id.txt_filter_edit); // filter mSearchEditText.addTextChangedListener(new TextWatcher() { public void onTextChanged(CharSequence str, int arg1, int arg2, int arg3) { try { filerData(str.toString()); } catch (BadHanyuPinyinOutputFormatCombination e) { e.printStackTrace(); } } public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { } public void afterTextChanged(Editable arg0) { } }); } @Override public void init() { super.init(); //获取本地存储userid user_id = SharedPreferencesUtil.readUserId(context); adapter = new SortAddAdapter(context, sortModelList, des_list, message); adapter.setAddListener(new SortAddAdapter.ShuaxinTxlAddListener() { @Override public void addTongxunlu(String twoUserId) { add_tongxunlu(twoUserId);//添加到通迅录 addGuanZhu(twoUserId);//添加通讯录列表不好使了,就把他变成关注此用户就行了 } }); adapter.setTxlYaoQingListener(new SortAddAdapter.TxlYaoQingListener() { @Override public void txlYaoQing(String phone) { yaoqingtongshi(phone); } }); sortListView.setAdapter(adapter); readTXLInfo(); } /** * 添加到关注 */ private void addGuanZhu(String twoUserId) { if (ULiangUtil.IsHaveInternet(context)) { dialog.show(); RequestParams params = new RequestParams(Const.URL_HOME_ADD_GUANZHU); params.addBodyParameter("be_user_id", twoUserId); params.addBodyParameter("user_id", user_id); ULiangHttp.postHttp(handler, params, URL_HOME_ADD_GUANZHU, Constants.TYPE_DATA); } else { ULiangUtil.getErroToast(context); } } @Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(context); } public void onEvent(NumberListBean nlb) { if (nlb.getIndex() == 233) { ArrayList<String> list = (ArrayList<String>) nlb.getList(); numberWork(list); } } List<JiaMiBean> jialist = new ArrayList<>(); private void numberWork(ArrayList<String> list) { JSONArray array = new JSONArray(); for (int a = list.size() - 1; a >= 0; a--) { JSONObject json = new JSONObject(); String name = ""; String namework = ""; String namehome = ""; String work = ""; String home = ""; String zongbu = ""; JiaMiBean jmb = new JiaMiBean(); String str = list.get(a); String[] arr = str.split(","); if (arr.length > 0) { name = arr[0]; namework = arr[1]; } try { json.put("ph_name", name); json.put("ph_num_work", namework); json.put("ph_num_home", namehome); json.put("ph_num_other", ""); array.put(json); } catch (JSONException e) { e.printStackTrace(); } } JSONObject j2 = new JSONObject(); try { j2.put("message", "有粮网"); j2.put("list", array); } catch (JSONException e) { e.printStackTrace(); } JSONObject json = new JSONObject(); try { json.put("content", j2); json.put("code", ""); json.put("msg", ""); } catch (JSONException e) { e.printStackTrace(); } setEncrypt(AES.encode(json.toString())); EventBus.getDefault().removeAllStickyEvents(); } //请求网络----------------- private void readTXLInfo() { if (!ULiangUtil.IsHaveInternet(context)) { ULiangUtil.getErroToast(context); return; } if (Build.VERSION.SDK_INT >= 23) { if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_CONTACTS)) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, 13); } else { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, 13); } } else { dialog.show(); new Thread(new Runnable() { @Override public void run() { TWX twx = PhoneContact.testReadAllContacts(context); Message message = new Message(); message.what = 6; message.obj = gson.toJson(twx); handler.sendMessage(message); } }).start(); } } else { dialog.show(); new Thread(new Runnable() { @Override public void run() { TWX twx = PhoneContact.testReadAllContacts(context); Message message = new Message(); message.what = 6; message.obj = gson.toJson(twx); handler.sendMessage(message); } }).start(); } } /** * 获取用户信息 */ private void initLoadData(TWX twx) { if (ULiangUtil.IsHaveInternet(context)) { RequestParams params = new RequestParams(Const.URL_TXL_LIST_IS_REGISTER); params.addBodyParameter("userId", user_id); params.addBodyParameter("phone", SharedPreferencesUtil.readPhone(context)); String phone = ""; phone = twx.getPhone(); if (StringUtils.isEmpty(phone)) { if (dialog != null) { if (dialog.isShowing()) { dialog.dismiss(); } } return; } des_list = twx.getList(); System.out.print(des_list.toString()); if (des_list == null || des_list.size() == 0) { sideBar.setVisibility(View.GONE); } else { sideBar.setVisibility(View.VISIBLE); for (int a = 0; a < des_list.size(); a++) { if (a != des_list.size() - 1) { sb.append("姓名:" + des_list.get(a).getName() + "电话:" + des_list.get(a).getPhoneBookId() + ","); } else { sb.append("姓名:" + des_list.get(a).getName() + "电话" + des_list.get(a).getPhoneBookId()); } } } if (!StringUtils.isEmpty(phone)) { String[] ss = phone.split(","); } Log.e("-----------", phone); params.addBodyParameter("phones", phone); mboolean = true; ULiangHttp.postHttp(handler, params, URL_TXL_LIST, Constants.TYPE_DATA); } else { ULiangUtil.getErroToast(context); } } @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case 13: { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { readTXLInfo(); } else { finish(); } return; } } } /** * 添加到通讯录 */ private void add_tongxunlu(String twoUserId) { if (ULiangUtil.IsHaveInternet(context)) { RequestParams params = new RequestParams(Const.URL_TXL_LIST_ADD); params.addBodyParameter("userId", user_id); params.addBodyParameter("twoUserId", twoUserId); ULiangHttp.postHttp(handler, params, URL_TXL_LIST_ADD, Constants.TYPE_DATA); } else { ULiangUtil.getErroToast(context); } } private void yaoqingtongshi(String phone) { if (ULiangUtil.IsHaveInternet(context)) { dialog.show(); RequestParams params = new RequestParams(Const.URL_YAOQINGTONGSHI_HY); params.addBodyParameter("contact_name", SharedPreferencesUtil.readNickName(context)); params.addBodyParameter("phone", phone); params.addBodyParameter("user_id", user_id); ULiangHttp.postHttp(handler, params, 4, Constants.TYPE_DATA); } else { ULiangUtil.getErroToast(context); } } //加密AES的key值常量 public final static String PASSWORD_CRYPT_KEY = "mapp_hz_server"; /** * 从通讯录删除 */ private void delete_tongxunlu(String phoneBookId) { if (ULiangUtil.IsHaveInternet(context)) { // dialog.show(); RequestParams params = new RequestParams(Const.URL_TXL_LIST_DELETE); params.addBodyParameter("phoneBookId", phoneBookId); ULiangHttp.postHttp(handler, params, URL_TXL_LIST_DELETE, Constants.TYPE_DATA); } else { ULiangUtil.getErroToast(context); } } Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); String result = (String) msg.obj; switch (msg.what) { case Constants.ERROR_DATA: // 错误dialog处理 if (dialog != null) { if (dialog.isShowing()) { dialog.dismiss(); } } ULiangUtil.getToast(context, Constants.HTTP_ERROR); break; case 45://加密上传 if (dialog != null) { if (dialog.isShowing()) { dialog.dismiss(); } } try { BaseBean baseBean = gson.fromJson(result, new TypeToken<BaseBean>() { }.getType()); if (baseBean != null && baseBean.getCode() == 0) { int code = baseBean.getCode(); if (code == 0) { StringUtils.toxunlu = false; } } else { if (!StringUtils.isEmpty(baseBean.getMsg())) { ULiangUtil.getToast(context, baseBean.getMsg()); //加密加载失败弹出的框,到时候看情况而定留不留; } } } catch (Exception e) { e.printStackTrace(); } break; case URL_HOME_ADD_GUANZHU: if (dialog != null) { if (dialog.isShowing()) { dialog.dismiss(); } } try { BaseBean<CompanyInfo> myUserBean = gson.fromJson(result, new TypeToken<BaseBean<CompanyInfo>>() { }.getType()); if (myUserBean != null && myUserBean.getCode() == 0) { ULiangUtil.getToast(context, "添加成功,请在我的-关注客户中查找"); } else { if (!StringUtils.isEmpty(myUserBean.getMsg())) { ULiangUtil.getToast(context, myUserBean.getMsg()); } } } catch (Exception e) { e.printStackTrace(); } break; case URL_TXL_LIST: //刷新时获取三角品种数据 if (dialog != null) { if (dialog.isShowing()) { dialog.dismiss(); } } try { BaseBean<TxuExist> myUserBean = gson.fromJson(result, new TypeToken<BaseBean<TxuExist>>() { }.getType()); if (myUserBean != null && myUserBean.getCode() == 0) { tongxulus = myUserBean.getContent().getList(); message = myUserBean.getContent().getMessage(); // encode = AES.encode(result); //进行加密des // encryptNoDes = DESUtils.encryptNoDes(result, PASSWORD_CRYPT_KEY); //setEncrypt(encode);//加密的方法,在这里做的加密 try { System.out.print(des_list.toString()); for (int i = 0; i < des_list.size(); i++) { SortModel sm = des_list.get(i); for (int j = 0; j < tongxulus.size(); j++) { Tongxunlu t = tongxulus.get(j); if (sm.getPhoneBookId().endsWith(t.getPhone())) { sm.setInbook(t.getInbook()); sm.setTwoUserId(t.getUser_id()); sm.setImg(t.getPerson_img()); sm.setInfo(t.getPhone()); sm.setId(sm.getPhoneBookId()); break; } } } sortModelList = filledData(); } catch (BadHanyuPinyinOutputFormatCombination e1) { e1.printStackTrace(); } // sort by a-z Collections.sort(sortModelList, comparator); adapter.updateListView(sortModelList, sortModelList, message); } else { if (!StringUtils.isEmpty(myUserBean.getMsg())) { ULiangUtil.getToast(context, myUserBean.getMsg()); } } } catch (Exception e) { e.printStackTrace(); } break; case URL_TXL_LIST_ADD: //刷新时获取三角品种数据 if (dialog != null) { if (dialog.isShowing()) { dialog.dismiss(); } } try { BaseBean<List<Tongxunlu>> myUserBean = gson.fromJson(result, new TypeToken<BaseBean<List<Tongxunlu>>>() { }.getType()); if (myUserBean != null && myUserBean.getCode() == 0) { readTXLInfo(); } else { if (!StringUtils.isEmpty(myUserBean.getMsg())) { ULiangUtil.getToast(context, myUserBean.getMsg()); } } } catch (Exception e) { e.printStackTrace(); } break; case URL_TXL_LIST_DELETE: //刷新时获取三角品种数据 if (dialog != null) { if (dialog.isShowing()) { dialog.dismiss(); } } try { BaseBean<List<Tongxunlu>> myUserBean = gson.fromJson(result, new TypeToken<BaseBean<List<Tongxunlu>>>() { }.getType()); if (myUserBean != null && myUserBean.getCode() == 0) { ULiangUtil.getToast(context, "删除成功"); readTXLInfo(); } else { if (!StringUtils.isEmpty(myUserBean.getMsg())) { ULiangUtil.getToast(context, myUserBean.getMsg()); } } } catch (Exception e) { e.printStackTrace(); } break; case 4: //刷新时获取三角品种数据 if (dialog != null) { if (dialog.isShowing()) { dialog.dismiss(); } } try { BaseBean<List<Tongxunlu>> myUserBean = gson.fromJson(result, new TypeToken<BaseBean<List<Tongxunlu>>>() { }.getType()); if (myUserBean != null && myUserBean.getCode() == 0) { // exitDialog(); ULiangUtil.getToast(context, "邀请已发出"); } else { if (!StringUtils.isEmpty(myUserBean.getMsg())) { ULiangUtil.getToast(context, myUserBean.getMsg()); } } } catch (Exception e) { e.printStackTrace(); } break; case 6: if (dialog != null) { if (dialog.isShowing()) { dialog.dismiss(); } } try { TWX twx = gson.fromJson(result, TWX.class); initLoadData(twx); } catch (JsonSyntaxException e) { e.printStackTrace(); } break; } } }; //进行加密AES private void setEncrypt(String encrypt) { if (ULiangUtil.IsHaveInternet(context)) { // dialog.show(); RequestParams params = new RequestParams(Const.URL_JIAMI); params.addBodyParameter("phlist", encrypt); ULiangHttp.postHttp(handler, params, 45, Constants.TYPE_DATA); } else { ULiangUtil.getErroToast(context); } } private List<SortModel> filledData() throws BadHanyuPinyinOutputFormatCombination { List<SortModel> mSortList = new ArrayList<SortModel>(); List<String> zimus = new ArrayList<String>(); for (int i = 0; i < des_list.size(); i++) { SortModel sortModel = new SortModel(); String name = des_list.get(i).getName(); if (StringUtils.isEmpty(name)) name = "未填写"; sortModel.setName(name); sortModel.setInfo(des_list.get(i).getPhoneBookId()); sortModel.setTwoUserId(des_list.get(i).getTwoUserId()); sortModel.setPhoneBookId(des_list.get(i).getPhoneBookId()); sortModel.setInbook(des_list.get(i).getInbook()); sortModel.setImg(des_list.get(i).getImg()); String pinyin = PinYinKit.getPingYin(name); String sortString = pinyin.substring(0, 1).toUpperCase(); if (sortString.matches("[A-Z]")) { sortModel.setSortLetters(sortString.toUpperCase()); zimus.add(sortString.toUpperCase()); } else { sortModel.setSortLetters("#"); zimus.add("#"); } sideBar.invalidate(); mSortList.add(sortModel); } return mSortList; } private void filerData(String str) throws BadHanyuPinyinOutputFormatCombination { List<SortModel> fSortModels = new ArrayList<SortModel>(); if (TextUtils.isEmpty(str)) fSortModels = sortModelList; else { fSortModels.clear(); for (SortModel sortModel : sortModelList) { String name = sortModel.getName(); if (name.indexOf(str.toString()) != -1 || PinYinKit.getPingYin(name).contains(str.toString()) || PinYinKit.getPingYin(name).contains(str.toUpperCase().toString())) { fSortModels.add(sortModel); } } } Collections.sort(fSortModels, comparator); adapter.updateListView(fSortModels, fSortModels, message); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.back: finish(); break; // case R.id.img_add: // initLoadData(); // break; // case R.id.img_sousuo: // break; // case R.id.ll_qunliao: // Toast.makeText(context,"群聊",Toast.LENGTH_LONG).show(); // break; // case R.id.ll_txl: // break; } } private void exitDialog() { final Dialog dialog = new Dialog(this, R.style.MyDialogStyle); dialog.setContentView(R.layout.yaoqingtongshi_chenggong); Button btn_wozhidaole = (Button) dialog.findViewById(R.id.btn_wozhidaole); btn_wozhidaole.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dialog.dismiss(); finish(); } }); dialog.setCanceledOnTouchOutside(true); dialog.show(); } public void onResume() { super.onResume(); MobclickAgent.onResume(this); } public void onPause() { super.onPause(); MobclickAgent.onPause(this); } }
下面的这个是布局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:background="@color/background" android:fitsSystemWindows="true" android:orientation="vertical"> <com.uliang.view.MyTitleView android:id="@+id/titleview" android:layout_width="match_parent" android:layout_height="wrap_content" /> <com.zhy.autolayout.AutoLinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <com.zhy.autolayout.AutoLinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="20px" android:layout_marginTop="20px" android:focusable="true" android:focusableInTouchMode="true" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="72px" android:layout_marginLeft="26px" android:layout_marginRight="60px" android:background="@drawable/my_linearlayout2" android:gravity="center_vertical" android:orientation="horizontal"> <ImageView android:layout_width="37px" android:layout_height="37px" android:layout_marginLeft="20px" android:src="@drawable/sousuo" /> <com.uliang.view.tongxunlu.SearchEditText android:id="@+id/txt_filter_edit" android:layout_width="660px" android:layout_height="72px" android:layout_gravity="center" android:layout_marginLeft="20px" android:layout_weight="1" android:background="@null" android:hint="搜索" android:imeOptions="actionSearch" android:singleLine="true" android:textAlignment="center" android:textColor="@color/textViewColor" android:textSize="32px" /> </LinearLayout> </com.zhy.autolayout.AutoLinearLayout> <!-- contact user list --> <com.zhy.autolayout.AutoFrameLayout android:layout_width="fill_parent" android:layout_height="fill_parent"> <ListView android:id="@+id/list_view_user_list" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="top" android:divider="@null"></ListView> <TextView android:id="@+id/txt_dialog" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:background="@drawable/txl_side_bg" android:gravity="center" android:textColor="@color/white" android:textSize="30.0dip" android:visibility="invisible" /> <com.uliang.view.tongxunlu.SideBar android:id="@+id/sild_bar" android:layout_width="60px" android:layout_height="wrap_content" android:layout_gravity="center|right" /> </com.zhy.autolayout.AutoFrameLayout> </com.zhy.autolayout.AutoLinearLayout> </LinearLayout>
下面的是sidebar的自定义view
package com.uliang.view.tongxunlu; 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; import com.uliang.R; import com.uliang.utils.ULiangUtil; public class SideBar extends View { // touching 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", "#" }; // if choosed private int choose = -1; private Paint paint = new Paint(); private TextView mTextDialog; // public void setB(String[] b) { // this.b = b; // } public void setmTextDialog(TextView mTextDialog) { this.mTextDialog = mTextDialog; } public SideBar(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public SideBar(Context context, AttributeSet attrs) { super(context, attrs); } public SideBar(Context context) { super(context); } // override onDraw function protected void onDraw(Canvas canvas) { super.onDraw(canvas); // get the height int height = getHeight(); // get the width int width = getWidth(); // get one letter height int singleHeight = height / b.length; for (int i = 0; i < b.length; i++) { paint.setColor(Color.rgb(153, 153, 153)); paint.setTypeface(Typeface.DEFAULT); paint.setAntiAlias(true); paint.setTextSize(ULiangUtil.sp2px(getContext(), 14)); // if choosed if (i == choose) { paint.setColor(getResources().getColor(R.color.title_background)); paint.setFakeBoldText(true); } // draw text float x = width / 2 - paint.measureText(b[i]) / 2; float y = singleHeight * i + singleHeight; canvas.drawText(b[i], x, y, paint); paint.reset(); } } @SuppressWarnings("deprecation") @Override public boolean dispatchTouchEvent(MotionEvent event) { final int action = event.getAction(); final float y = event.getY(); // get the Y final int oldChoose = choose; final OnTouchingLetterChangedListener changedListener = onTouchingLetterChangedListener; final int letterPos = (int) (y / getHeight() * b.length); 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.bg_sidebar); if (oldChoose != letterPos) { if (letterPos >= 0 && letterPos < b.length) { if (changedListener != null) changedListener.onTouchingLetterChanged(b[letterPos]); if (mTextDialog != null) { mTextDialog.setText(b[letterPos]); mTextDialog.setVisibility(View.VISIBLE); } choose = letterPos; invalidate(); } } break; } return true; } public void setOnTouchingLetterChangedListener(OnTouchingLetterChangedListener changedListener) { this.onTouchingLetterChangedListener = changedListener; } public interface OnTouchingLetterChangedListener { public void onTouchingLetterChanged(String str); } }