自定义listView,仿微信好友列表,右侧带字母排序。
2016-11-28 16:13
555 查看
先上图
MainActivity:
demo下载
MainActivity:
package com.finddreams.sortedcontact; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Map; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.os.AsyncTask; import android.os.Bundle; import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; import android.view.Gravity; import android.view.View; import android.view.View.OnFocusChangeListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import com.finddreams.sortedcontact.sortlist.CharacterParser; import com.finddreams.sortedcontact.sortlist.SideBar; import com.finddreams.sortedcontact.sortlist.SortModel; import com.finddreams.sortedcontact.sortlist.SideBar.OnTouchingLetterChangedListener; /** * 联系人显示界面 * @author Angus * */ public class MainActivity extends Activity { private View mBaseView; private ListView sortListView; private SideBar sideBar; private TextView dialog; private SortAdapter adapter; private ClearEditText mClearEditText; private Map<String, String> callRecords; private CharacterParser characterParser; private List<SortModel> SourceDateList; private PinyinComparator pinyinComparator; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_main_contact); initView(); initData(); } private void initView() { sideBar = (SideBar) this.findViewById(R.id.sidrbar); dialog = (TextView) this.findViewById(R.id.dialog); sortListView = (ListView) this.findViewById(R.id.sortlist); } private void initData() { // 实例化汉字转拼音类 characterParser = CharacterParser.getInstance(); pinyinComparator = new PinyinComparator(); sideBar.setTextView(dialog); // 设置右侧触摸监听 sideBar.setOnTouchingLetterChangedListener(new OnTouchingLetterChangedListener() { @SuppressLint("NewApi") @Override public void onTouchingLetterChanged(String s) { // 该字母首次出现的位置 int position = adapter.getPositionForSection(s.charAt(0)); if (position != -1) { sortListView.setSelection(position); } } }); sortListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // 这里要利用adapter.getItem(position)来获取当前position所对应的对象 // Toast.makeText(getApplication(), // ((SortModel)adapter.getItem(position)).getName(), // Toast.LENGTH_SHORT).show(); String number = callRecords.get(((SortModel) adapter .getItem(position)).getName()); Toast.makeText(MainActivity.this, number, 0).show(); } }); new ConstactAsyncTask().execute(0); } private class ConstactAsyncTask extends AsyncTask<Integer, Integer, Integer> { @Override protected Integer doInBackground(Integer... arg0) { int result = -1; callRecords = ConstactUtil.getAllCallRecords(MainActivity.this); result = 1; return result; } @Override protected void onPostExecute(Integer result) { super.onPostExecute(result); if (result == 1) { List<String> constact = new ArrayList<String>(); for (Iterator<String> keys = callRecords.keySet().iterator(); keys .hasNext();) { String key = keys.next(); constact.add(key); } String[] names = new String[] {}; names = constact.toArray(names); SourceDateList = filledData(names); // 根据a-z进行排序源数据 Collections.sort(SourceDateList, pinyinComparator); adapter = new SortAdapter(MainActivity.this, SourceDateList); sortListView.setAdapter(adapter); mClearEditText = (ClearEditText) MainActivity.this .findViewById(R.id.filter_edit); mClearEditText.setOnFocusChangeListener(new OnFocusChangeListener() { @Override public void onFocusChange(View arg0, boolean arg1) { mClearEditText.setGravity(Gravity.LEFT|Gravity.CENTER_VERTICAL); } }); // 根据输入框输入值的改变来过滤搜索 mClearEditText.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // 当输入框里面的值为空,更新为原来的列表,否则为过滤数据列表 filterData(s.toString()); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { } }); } } @Override protected void onPreExecute() { super.onPreExecute(); } } /** * 为ListView填充数据 * * @param date * @return */ private List<SortModel> filledData(String[] date) { List<SortModel> mSortList = new ArrayList<SortModel>(); for (int i = 0; i < date.length; i++) { SortModel sortModel = new SortModel(); sortModel.setName(date[i]); // 汉字转换成拼音 String pinyin = characterParser.getSelling(date[i]); String sortString = pinyin.substring(0, 1).toUpperCase(); // 正则表达式,判断首字母是否是英文字母 if (sortString.matches("[A-Z]")) { sortModel.setSortLetters(sortString.toUpperCase()); } else { sortModel.setSortLetters("#"); } mSortList.add(sortModel); } return mSortList; } /** * 根据输入框中的值来过滤数据并更新ListView * * @param filterStr */ private void filterData(String filterStr) { List<SortModel> filterDateList = new ArrayList<SortModel>(); if (TextUtils.isEmpty(filterStr)) { filterDateList = SourceDateList; } else { filterDateList.clear(); for (SortModel sortModel : SourceDateList) { String name = sortModel.getName(); if (name.indexOf(filterStr.toString()) != -1 || characterParser.getSelling(name).startsWith( filterStr.toString())) { filterDateList.add(sortModel); } } } // 根据a-z进行排序 Collections.sort(filterDateList, pinyinComparator); adapter.updateListView(filterDateList); } }适配器:
package com.finddreams.sortedcontact; import java.util.List; import com.finddreams.sortedcontact.sortlist.SortModel; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.SectionIndexer; import android.widget.TextView; /** * 用来处理集合中数据的显示与排序 * @author Angus * */ public class SortAdapter extends BaseAdapter implements SectionIndexer{ private List<SortModel> list = null; private Context mContext; public SortAdapter(Context mContext, List<SortModel> list) { this.mContext = mContext; this.list = list; } /** * 当ListView数据发生变化时,调用此方法来更新ListView * @param list */ public void updateListView(List<SortModel> list){ this.list = list; notifyDataSetChanged(); } public int getCount() { return this.list.size(); } public Object getItem(int position) { return list.get(position); } public long getItemId(int position) { return position; } public View getView(final int position, View view, ViewGroup arg2) { ViewHolder viewHolder = null; final SortModel mContent = list.get(position); if (view == null) { viewHolder = new ViewHolder(); view = LayoutInflater.from(mContext).inflate(R.layout.phone_constacts_item, null); viewHolder.tvTitle = (TextView) view.findViewById(R.id.title); viewHolder.tvLetter = (TextView) view.findViewById(R.id.catalog); viewHolder.icon = (ImageTextView) view.findViewById(R.id.icon); view.setTag(viewHolder); } else { viewHolder = (ViewHolder) view.getTag(); } //根据position获取分类的首字母的Char ascii值 int section = getSectionForPosition(position); //如果当前位置等于该分类首字母的Char的位置 ,则认为是第一次出现 if(position == getPositionForSection(section)){ viewHolder.tvLetter.setVisibility(View.VISIBLE); viewHolder.tvLetter.setText(mContent.getSortLetters()); }else{ viewHolder.tvLetter.setVisibility(View.GONE); } viewHolder.tvTitle.setText(this.list.get(position).getName()); viewHolder.icon.setText(this.list.get(position).getName()); viewHolder.icon.setIconText(mContext,this.list.get(position).getName()); return view; } final static class ViewHolder { TextView tvLetter; TextView tvTitle; ImageTextView icon; } /** * 根据ListView的当前位置获取分类的首字母的Char ascii值 */ public int getSectionForPosition(int position) { return list.get(position).getSortLetters().charAt(0); } /** * 根据分类的首字母的Char ascii值获取其第一次出现该首字母的位置 */ 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; } /** * 提取英文的首字母,非英文字母用#代替。 * * @param str * @return */ private String getAlpha(String str) { String sortStr = str.trim().substring(0, 1).toUpperCase(); // 正则表达式,判断首字母是否是英文字母 if (sortStr.matches("[A-Z]")) { return sortStr; } else { return "#"; } } @Override public Object[] getSections() { return null; } }
demo下载
相关文章推荐
- android 自定义ListView显示微信聊天好友列表
- 完全仿QQ好友列表,自定义ExpandableListView!
- 自定义快速索引,仿微信好友查询列表
- Android中使用listview实现qq/微信好友列表
- ListView首字母排序+右侧字母索引+首字母查找姓名
- android-自定义View-GridListView(仿Q空间好友动态列表图片展示方式)
- Android 仿联系人列表 实现ListView的A-Z字母排序和过滤搜索功能
- 完全仿QQ好友列表,自定义ExpandableListView!
- 城市列表自定义view(右侧索引字母)
- Android 仿联系人列表 实现ListView的A-Z字母排序和过滤搜索功能,并挤压效果
- 自定义listview右侧的字母导航view,滑动view时,listview显示的分组为自定义view的滑动到的字母
- Android联系人列表,实现ListView的A-Z字母排序和过滤搜索功能,字母条目上顶
- 微信小程序开发之好友列表字母列表跳转对应位置
- Android 仿联系人列表 实现ListView的A-Z字母排序和过滤搜索功能,并挤压效果(一)
- Android仿微信通讯录功能,好友排序+字母索引
- Android中ListView字母排序,实现字母挤压效果以及右侧快速选中字母,搜索关键字功能
- Android自定义A_Z字母排序ListView,悬停Listview
- Android城市列表,首字母排序,右侧点击字母定位
- Android仿微信通讯录功能,好友排序+字母索引
- ExpandableListView(可张开列表)+右侧字母索引条的使用