微信联系人列表点击侧边栏首字母定位到相应联系人列表的实现方法

默认创建好联系人显示列表;

1,在主页activity_main添加新的listview;

  <ListView
        Android:divider="@null"
        android:id="@+id/lv_sections"
        android:layout_width="18dp"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true" />

2,在mainactivity中关联此listview;

并且声明一个string类型的数组sections,用来装之后获取到的分类字母;

3,声明一个Arrayadapter;

sectionAdapter = new ArrayAdapter<String>(this,android. R.layout.simple.item, sections);

4,在 baseadapter的继承子类中实现sectionindexer;

public class ContactAdapter extends BaseAdapter implements SectionIndexer 

在该类中重写接口的方法

int ch = getSectionForPosition(position);//获得当前位置的拼音首字母是啥,这些方法是实现接口sectionindexer
// 获取该首字母应该出现的位置
int pos = getPositionForSection(ch);//再找到上面找到的首字母是在第几位首次出现的;
// 对比
if (position == pos) {
tvSection.setVisibility(View.VISIBLE);
} else {
tvSection.setVisibility(View.GONE);
}


// 5. 返回模版View对象
return convertView;//此时完成相同首字母的名字在同一个大写字母分类条目下;
}


// section:分类字母
// position:位置


@Override
public int getSectionForPosition(int position) {//重写的方法,在position位置处获取首字母
// 获取某个位置(position)的数据对应的分类字母(section)
return contacts.get(position).getPinyin().toUpperCase(Locale.CHINA).charAt(0);//char类型=int;
}


@Override
public int getPositionForSection(int section) {
// 获取某个分类字母(section)应该出现的位置(position)
// 循环整个数据的集合:遍历
for (int i = 0; i < contacts.size(); i++) {
// 在循环过程中,取出当前循环到的数据的首字母
// int ch =
// contacts.get(i).getPinyin().toUpperCase(Locale.CHINA).charAt(0);
int ch = getSectionForPosition(i);//获取i位置的分类条目大写字母是啥
// 与参数传入的section参数进行对比
if (ch == section) {
// 如果是相同的,则意味着找到了,停止继续向后查找
return i;
}
}
return NO_SUCH_SECTION; // 该字母在列表中不存在,返回一个找不到的位置
}


public static final int NO_SUCH_SECTION = -1;


@Override
public Object[] getSections() {//让侧边栏只显示出现的分类字母
// 准备List集合,用于保存所有应该出现的分类字母
List<String> list = new ArrayList<String>();
// 遍历所有联系人,将每个联系人的分类字母添加到集合中
for (int i = 0; i < contacts.size(); i++) {
// 取出分类字母 -> 'A' -> 65
int section = getSectionForPosition(i);
// 将分类字母转为字符串 -> "A"
String str = (char)section + "";
// 检查被添加的字母在集合中是否已经存在
if (!list.contains(str)) {
// 将分类字母添加到集合中
list.add(str);
}
}

// 创建数组
String[] sections = new String[list.size()];
// 将集合中的分类字母全部添加到数组中
for (int i = 0; i < list.size(); i++) {
sections[i] = list.get(i);
}

// 返回数组
return sections;
}

5,在mainactivity中获取侧边栏的字母,之后承接arrayadapter;

sections = (String[]) contactAdapter.getSections();//获取侧边栏要显示的字母数组并且将objects强转为String类
6,为侧边栏设置item监听器,
监听器内的方法为:

public void onItemClick(AdapterView<?> parent, // 点的哪个ListView的Item 

                               View view, // 点的哪个Item
int position, // 点的是第??个Item
long id // 无视
) {
// 点的是哪个字母
String str = sections[position]; // "D"获取当前点击的字母
// 得到char类型的字母,为int类型
int section = str.charAt(0); // char类型的字母'D'
// 点的字母对应的位置
int pos = contactAdapter.getPositionForSection(section);
// 判断该位置是否合法,即:该字母在数据列表中是否存在
if (pos != ContactAdapter.NO_SUCH_SECTION) {
// 联系人列表的ListView快速定位到某个位置
lvContacts.setSelection(pos);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值