ListView分拦,顶部停留,两个ListView联动显示效果
2015-07-30 17:52
453 查看
package com.example.androidtest; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import android.annotation.SuppressLint; import android.app.Activity; import android.content.ContentResolver; import android.database.Cursor; import android.graphics.Color; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; import android.widget.TextView; import com.emilsjolander.components.stickylistheaders.StickyListHeadersAdapter; import com.emilsjolander.components.stickylistheaders.StickyListHeadersListView; public class MainActivity extends Activity { private ListView leftListView; private StickyListHeadersListView rightRistView; /** * 存放所有的字母对应的分组显示的索引位置 如: A:0第一条的头部显示分组A * * B:5在第六条记录显示分组B */ private HashMap<String, Integer> letterMap; /** 分组的显示的索引位置 */ private int groupPosition; /** 通讯录所有的联系人 */ private List<ContactInfo> contacts; /** 通讯录中所有的分组的首字母(已去重) */ private ArrayList<String> letterList; /** 左边字母的适配器 */ private MyLetterAdapter leftAdapter; /** 右边listview的适配器 */ private MyAdapter rightAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); contacts = getContacts(getContentResolver()); if (contacts != null && contacts.size() > 0) { // 初始化 letterMap = new HashMap<String, Integer>(); sortContanctList(); countGroupPosition(contacts); leftAdapter = new MyLetterAdapter(letterList); rightAdapter = new MyAdapter(contacts); leftListView.setAdapter(leftAdapter); rightRistView.setAdapter(rightAdapter); setListener(); } } /** * 设置事件监听 */ private void setListener() { leftListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //点击的item对应右边分组要顶部并且高亮显示 String letter = letterList.get(position); Integer contactPosition = letterMap.get(letter); rightAdapter.setHighlightPosition(contactPosition); rightAdapter.notifyDataSetChanged(); rightRistView.setSelection(contactPosition); //点击的item也要高亮显示 leftAdapter.setHighlightPosition(position); leftAdapter.notifyDataSetChanged(); } }); rightRistView.setOnScrollListener(new OnScrollListener() { /** * 记录listview的状态 * * scrollState = SCROLL_STATE_TOUCH_SCROLL(1) 正在滚动 * scrollState = SCROLL_STATE_FLING(2) 手指做了抛的动作(手指离开屏幕前,用力滑了一下) * scrollState = SCROLL_STATE_IDLE(0) 停止滚动 */ private int scrollState; @Override public void onScrollStateChanged(AbsListView view, int scrollState) { this.scrollState = scrollState; } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { //当用户已经停止滑动了,就不再执行下面的操作 if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) { return; } ContactInfo contactInfo = contacts.get(firstVisibleItem); String letter = PingYinUtil.converterToFirstSpell( contactInfo.getName()).substring(0, 1); // 获取到分组(字母分组)的索引位置 int letterPosition = letterList.indexOf(letter); // 让listview跟着右边的listview的滑动,进行联动效果 leftListView.setSelection(letterPosition); // 通讯录列表里面通过屏幕显示的第一条数据的索引值,让其高亮显示 rightAdapter.setHighlightPosition(firstVisibleItem); // 通讯录里面,屏幕显示的第一条数据的索引值对应到左侧字母对应的索引位置,让其高亮显示 leftAdapter.setHighlightPosition(letterPosition); System.out.println("onScroll-----------------"); } }); } /** * 对通讯录进行排序 */ private void sortContanctList() { // 对通讯录里面的数据进行排序(A-Z) Collections.sort(contacts, new Comparator<ContactInfo>() { @SuppressLint("DefaultLocale") @Override public int compare(ContactInfo cn1, ContactInfo cn2) { // 取首字母 String str1 = PingYinUtil.converterToFirstSpell(cn1.getName() .substring(0, 1)); String str2 = PingYinUtil.converterToFirstSpell(cn2.getName() .substring(0, 1)); String c1 = ""; String c2 = ""; if (str1 != null) { c1 = str1.toUpperCase(); } if (str2 != null) { c2 = str2.toUpperCase(); } return c1.compareTo(c2); } }); } /** * 初始化控件 */ private void initView() { leftListView = (ListView) this.findViewById(R.id.leftListView); rightRistView = (StickyListHeadersListView) this .findViewById(R.id.rightRistView); } /** * 读取通讯录 * * @param cr * @return */ public static List<ContactInfo> getContacts(ContentResolver cr) { List<ContactInfo> Contacts = new ArrayList<ContactInfo>(); Uri uri = Uri.parse("content://com.android.contacts/contacts"); Cursor cursor = cr.query(uri, new String[] { "_id" }, null, null, null); while (cursor.moveToNext()) { int contractID = cursor.getInt(0); ContactInfo info = new ContactInfo(); uri = Uri.parse("content://com.android.contacts/contacts/" + contractID + "/data"); Cursor cursor1 = cr.query(uri, new String[] { "mimetype", "data1", "data2" }, null, null, null); while (cursor1.moveToNext()) { String data1 = cursor1.getString(cursor1 .getColumnIndex("data1")); String mimeType = cursor1.getString(cursor1 .getColumnIndex("mimetype")); if ("vnd.android.cursor.item/name".equals(mimeType)) { // 是姓名 info.setName(data1); } else if ("vnd.android.cursor.item/phone_v2".equals(mimeType)) { // 手机 info.setNumber(data1); } } cursor1.close(); Contacts.add(info); } cursor.close(); return Contacts; } /** * 计算并存储分组在列表中显示的位置 * * @param list */ public void countGroupPosition(List<ContactInfo> list) { for (int j = 0; j < list.size(); j++) { ContactInfo contactInfo = list.get(j); String firstSpell = PingYinUtil.converterToFirstSpell( contactInfo.getName()).substring(0, 1); if (!letterMap.keySet().contains(firstSpell)) { letterMap.put(firstSpell, j); } } // map转换成list letterList = new ArrayList<String>(letterMap.keySet()); // 对list进行排序 Collections.sort(letterList); } /** * 通讯录的适配器 * * @author liulimeng_pc */ class MyAdapter extends MyBaseAdapter<ContactInfo> implements StickyListHeadersAdapter { private int highlightPosition; public MyAdapter(List<ContactInfo> list) { super(list); } public void setHighlightPosition(int firstVisibleItem) { this.highlightPosition = firstVisibleItem; //更新一下状态 rightAdapter.notifyDataSetChanged(); } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { holder = new ViewHolder(); convertView = View.inflate(MainActivity.this, R.layout.right, null); holder.name = (TextView) convertView.findViewById(R.id.name); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } ContactInfo contactInfo = contacts.get(position); holder.name.setText(contactInfo.getName() + "\t" + contactInfo.getNumber()); return convertView; } @Override public View getHeaderView(int position, View convertView, ViewGroup arg2) { if (convertView == null) { convertView = View.inflate(MainActivity.this, R.layout.header, null); } TextView tv_letter = (TextView) convertView .findViewById(R.id.text1); ContactInfo contactInfo = contacts.get(position); String l 9e12 etter = PingYinUtil.converterToFirstSpell(contactInfo .getName().substring(0, 1)); // 如果明目显示的第一条数据和当前显示的数据的索引值一直,就高亮显示 if (highlightPosition == position) { tv_letter.setTextColor(Color.WHITE); tv_letter.setBackgroundColor(Color.RED); } else { tv_letter.setTextColor(Color.BLACK); tv_letter.setBackgroundColor(Color.GRAY); } tv_letter.setText(String.valueOf(letter)); return convertView; } /** * 此方法返回的索引值,是分组显示字母的索引位置 */ @Override public long getHeaderId(int position) { ContactInfo contactInfo = contacts.get(position); String letter = PingYinUtil.converterToFirstSpell(contactInfo .getName().substring(0, 1)); return letterMap.get(letter); } } /** * 字母的适配器 * * @author liulimeng_pc */ class MyLetterAdapter extends MyBaseAdapter<String> { private int highlightPosition; public MyLetterAdapter(List<String> list) { super(list); } public void setHighlightPosition(int highlightPosition) { this.highlightPosition = highlightPosition; leftAdapter.notifyDataSetChanged(); } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { holder = new ViewHolder(); convertView = View.inflate(MainActivity.this, R.layout.left, null); holder.title = (TextView) convertView.findViewById(R.id.title); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } // 和通讯录中屏幕显示的分组一起同步高亮显示 if (highlightPosition == position) { holder.title.setBackgroundColor(Color.RED); holder.title.setTextColor(Color.WHITE); } else { holder.title.setBackgroundColor(Color.WHITE); holder.title.setTextColor(Color.BLACK); } holder.title.setText(letterList.get(position)); return convertView; } } class ViewHolder { private TextView title; private TextView name; } }
源码地址:http://download.csdn.net/detail/loomis13/8947177
相关文章推荐
- Formatter
- css模块化思想(一)
- java DataUtil 处理类
- 文件处理——文件重定向(二)
- C++ Primer Plus 学习笔记(第六章)
- HDU 5336 XYZ and Drops 2015 Multi-University Training Contest 4 1010
- Tkinter pack grid place 函数
- 微博多机房体系
- Spring中IOC和AOP的详细解释
- Sublime Text 3能用支持的插件推荐
- UserDefault
- Junit-12
- Ubuntu终端Terminal常用快捷键
- 枚举定义的两种方法
- java.lang.IllegalArgumentException:No view found for id for fragment 的解决
- 多IDC数据分布--MySQL多机房部署 - 学习笔记 - 51CTO技术博客
- @清晰掉 C++ 中的 enum 结构在内存中是怎么存储的?
- 设计模式之 策略模式
- Android重启应用程序代码
- Windows批处理:自动检查服务器连通性