您的位置:首页 > 其它

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: