微信聯繫人列表點擊側邊欄首字母定位到相應聯繫人列表的實現方法

默認創建好聯繫人顯示列表;

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);
}

發佈了30 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章