日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

通讯录列表

發(fā)布時間:2023/12/20 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 通讯录列表 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

因為項目需求通訊錄樣式的列表

1.帶有模糊搜索

2.帶有字母索引

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

思路:首先是定義一個右側(cè)的導(dǎo)航條母,然后是顯示字母的list view 最后添加搜索內(nèi)容

定義一個右側(cè)導(dǎo)航條目

/** * Created by wjs on 2017/11/7. * 右側(cè)的導(dǎo)航欄 */ public class SideBar extends View {private Paint paint = new Paint(); private int height,width;// 獲取對應(yīng)高度.寬度 private int singleHeight;// 獲取每一個字母的高度 private int choose = -1;// 選中 private int oldChoose = choose; private String[] index_string ={"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", "#"}; private int index_y; private float y; private TextView mTextDialog; // 觸摸事件 private OnTouchChangedListener onTouchChanged; public void setTextView(TextView mTextDialog) {this.mTextDialog = mTextDialog; }public SideBar(Context context) {super(context); }public SideBar(Context context, AttributeSet attrs) {super(context, attrs); }public SideBar(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr); }@Override protected void onDraw(Canvas canvas) {super.onDraw(canvas); height = getHeight(); width = getWidth(); singleHeight = height / index_string.length; for (int i = 0; i < index_string.length; i++){paint.setColor(Color.rgb(33, 65, 98));//給畫筆設(shè)置顏色值 paint.setTypeface(Typeface.DEFAULT_BOLD);// paint.setAntiAlias(true);//設(shè)置畫筆是否抗鋸齒 paint.setTextSize(20); // 選中的狀態(tài) if (i == choose) {paint.setColor(Color.parseColor("#3399ff")); paint.setFakeBoldText(true); }// x坐標等于中間-字符串寬度的一半. float xPos = width / 2 - paint.measureText(index_string[i]) / 2; //y坐標等于n+1個字母的高度 float yPos = singleHeight * i + singleHeight; canvas.drawText(index_string[i], xPos,yPos ,paint); paint.reset();// 重置畫筆 }}@Override public boolean dispatchTouchEvent(MotionEvent event) {OnTouchChangedListener listener = onTouchChanged; // 點擊y坐標 y = event.getY(); // 點擊y坐標所占總高度的比例*b數(shù)組的長度就等于點擊b中的個數(shù). index_y = (int) (y / getHeight() * index_string.length); switch (event.getAction()){case MotionEvent.ACTION_UP:setBackgroundDrawable(new ColorDrawable(0x00000000)); choose = -1;// invalidate(); if (mTextDialog != null) {mTextDialog.setVisibility(View.INVISIBLE); }break; default:// 設(shè)置右側(cè)字母列表[A,B,C,D,E....]的背景顏色 setBackgroundResource(R.drawable.sidebar_background); if (oldChoose != index_y) {if (index_y >= 0 && index_y < index_string.length) {if (listener != null) {listener.onTouchChanged(index_string[index_y]); }if (mTextDialog != null) {mTextDialog.setText(index_string[index_y]); mTextDialog.setVisibility(View.VISIBLE); }choose = index_y; invalidate(); }}break; }return true; }/** * 向外公開的方法 * * @param onTouchChanged */ public void setOnTouchingLetterChangedListener(OnTouchChangedListener onTouchChanged) {this.onTouchChanged = onTouchChanged; }/** * 接口 * * @author coder * */ public interface OnTouchChangedListener {public void onTouchChanged(String s); } }

list view不用定義就要list view就好。adapter需要處理一下

/** * Created by wjs on 2017/11/7. * 人名 */ public class SearchAdapter extends BaseAdapter {private List<nameData.ListEntity> list = null; private Context context; public SearchAdapter(Context context, List<nameData.ListEntity> list) {this.context = context; this.list = list; }/** * 當ListView數(shù)據(jù)發(fā)生變化時,調(diào)用此方法來更新ListView * * @param list */ public void updateListView(List<nameData.ListEntity> list) {this.list = list; notifyDataSetChanged(); }@Override public int getCount() {if (list.size() > 0) {return list.size(); } else {return 0; }}@Override public Object getItem(int i) {return list.get(i); }@Override public long getItemId(int i) {return i; }@Override public View getView(int position, View view, ViewGroup viewGroup) {ViewHolder viewHolder = null; if (view == null) {viewHolder = new ViewHolder(); view = LayoutInflater.from(context).inflate(R.layout.item_listview, viewGroup, false); viewHolder.name = (TextView) view.findViewById(R.id.name); viewHolder.iv = (ImageView) view.findViewById(R.id.iv); viewHolder.tvLetter = (TextView) view.findViewById(R.id.catalog); view.setTag(viewHolder); } else {viewHolder = (ViewHolder) view.getTag(); }// 根據(jù)position獲取分類的首字母的Char ascii值 int section = getSectionForPosition(position); // 如果當前位置等于該分類首字母的Char的位置 ,則認為是第一次出現(xiàn) if (position == getPositionForSection(section)) {viewHolder.tvLetter.setVisibility(View.VISIBLE); viewHolder.tvLetter.setText(list.get(position).getSortLetters()); } else {viewHolder.tvLetter.setVisibility(View.GONE); }viewHolder.name.setText(list.get(position).getNickname()); Glide.with(context).load(R.mipmap.ic_launcher).into(viewHolder.iv); return view; }final static class ViewHolder {TextView name; ImageView iv; TextView tvLetter; }/** * 根據(jù)ListView的當前位置獲取分類的首字母的Char ascii值 */ public int getSectionForPosition(int position) {return list.get(position).getSortLetters().charAt(0); }/** * 根據(jù)分類的首字母的Char ascii值獲取其第一次出現(xiàn)該首字母的位置 */ public int getPositionForSection(int section) {for (int i = 0; i < getCount(); i++) {String sortStr = list.get(i).getSortLetters(); char firstChar = sortStr.toUpperCase().charAt(0); if (firstChar == section) {return i; }}return -1; } }

mainactivity里面處理

public class MainActivity extends AppCompatActivity {private String ss = "{\"list\":[{\"is_follow\":0,\"nickname\":\"波多野結(jié)衣\",\"user_id\":1,\"avatar\":\"http://image.chaokeli.cn/chocolate/15058077363962.jpg?imageView2/4/w/200\",\"follower_number\":5}],\"total\":3,\"error_code\":0}"; private SideBar sideBar; private TextView dialog; private ListView listview; private List<nameData.ListEntity> list = new ArrayList<>();//解析出來后的集合 private SearchAdapter adapter; /** * 根據(jù)拼音來排列ListView里面的數(shù)據(jù)類 * 拼音比較器 */ private PinyinComparator pinyinComparator = new PinyinComparator(); /** * 漢字轉(zhuǎn)換成拼音的類 */ private CharacterParser characterParser; private SerchEditText searchEdit; private List<nameData.ListEntity> nameDatasList;//排序好的集合 @Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initData(); }private void initView() {sideBar = (SideBar) findViewById(R.id.sidebar); dialog = (TextView) findViewById(R.id.dialog); listview = (ListView) findViewById(R.id.listview); searchEdit = (SerchEditText) findViewById(R.id.search_edit); sideBar.setTextView(dialog); }private void initData() {// 實例化漢字轉(zhuǎn)拼音類 characterParser = CharacterParser.getInstance(); Gson gson = new Gson(); nameData nameData = gson.fromJson(ss, nameData.class); list.addAll(nameData.getList()); //漢子轉(zhuǎn)換成拼音 nameDatasList = zi2pinyi(list); // 根據(jù)a-z進行排序源數(shù)據(jù) Collections.sort(nameDatasList, pinyinComparator); adapter = new SearchAdapter(MainActivity.this, nameDatasList); listview.setAdapter(adapter); //右側(cè)導(dǎo)航條目的觸摸監(jiān)聽 onSideBarListener(); // 根據(jù)輸入框輸入值的改變來過濾搜索 onSearchEditListener(); //listview點擊事件 onListviewListener(); }/** * listview點擊事件 */ private void onListviewListener() {listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {// Toast.makeText(MainActivity.this,nameDatasList.get(i).getNickname(),Toast.LENGTH_SHORT).show(); }}); }/** * 根據(jù)輸入框輸入值的改變來過濾搜索 */ private void onSearchEditListener() {searchEdit.addTextChangedListener(new TextWatcher() {@Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}@Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {// 當輸入框里面的值為空,更新為原來的列表,否則為過濾數(shù)據(jù)列表 filterData(charSequence.toString()); }@Override public void afterTextChanged(Editable editable) {}}); }/** * 右側(cè)導(dǎo)航條目的觸摸監(jiān)聽 */ private void onSideBarListener() {sideBar.setOnTouchingLetterChangedListener(new SideBar.OnTouchChangedListener() {@Override public void onTouchChanged(String s) {//點擊字母出現(xiàn)在當前頁面 int position = adapter.getPositionForSection(s.charAt(0)); if (position != -1) {listview.setSelection(position); }}}); }private List<nameData.ListEntity> zi2pinyi(List<nameData.ListEntity> list) {for (int i = 0; i < list.size(); i++) {// 漢字轉(zhuǎn)換成拼音 String pinyin = characterParser.getSelling(list.get(i).getNickname()); String sortString = pinyin.substring(0, 1).toUpperCase(); // 正則表達式,判斷首字母是否是英文字母 if (sortString.matches("[A-Z]")) {list.get(i).setSortLetters(sortString.toUpperCase()); } else {list.get(i).setSortLetters("#"); }}return list; }/** * 根據(jù)輸入框中的值來過濾數(shù)據(jù)并更新ListView * * @param filterStr */ private void filterData(String filterStr) {List<nameData.ListEntity> list2 = new ArrayList(); if (TextUtils.isEmpty(filterStr)) {list2.addAll(nameDatasList); } else {list2.clear(); for (nameData.ListEntity namedata : nameDatasList) {String name = namedata.getNickname(); if (name.indexOf(filterStr.toString()) != -1 ||characterParser.getSelling(name).startsWith(filterStr.toString())) {list2.add(namedata); }}}// 根據(jù)a-z進行排序 Collections.sort(list2, pinyinComparator); adapter.updateListView(list2); } }

更多詳細代碼請看demo

demo下載:http://download.csdn.net/download/qq_35698774/10109826

轉(zhuǎn)載表明出處http://write.blog.csdn.net/postedit

qq群:471761982



總結(jié)

以上是生活随笔為你收集整理的通讯录列表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。