通讯录右边的26个英文字母,点击同步

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);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
jQuery通讯录右边的字母是用来实现通过点击字母索引快速跳转通讯录中对应字母开头的联系人的功能。 在通讯录界面的右边,通常会显示一个垂直排列的字母列表,每个字母都对应着通讯录中的一部分联系人。通过点击这些字母,页面会自动滚动到相应字母开头的联系人位置,方便用户快速找到所需联系人。 实现这一功能,可以使用jQuery库中的一些方法和事件。首先,可以通过选择器选中字母列表中的每个字母元素,如$("#letterList li")。然后,可以通过为每个字母元素绑定点击事件,当用户点击字母时触发相应的操作。 在点击事件的处理函数中,可以获取到点击的字母对应的值,如$(this).text(),然后可以通过该值来找到通讯录中对应字母开头的联系人元素,如$(".contacts").find(".letter:contains("+ value +")")。接着,使用滚动操作,将页面滚动到该联系人元素位置,实现快速跳转的效果。 除了这个基本功能,还可以配合一些视觉效果,如高亮选中的字母,通过CSS类名的添加和删除来实现。同时,可以增加平滑滚动的动画效果,让用户体验更加流畅。 总结起来,使用jQuery的事件绑定和选择器功能,可以方便地实现通讯录右边字母的功能,让用户通过点击字母快速定位到对应联系人。这为用户提供了更加便捷的操作方式,提升了用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值