Android實(shí)現(xiàn)手機(jī)聯(lián)系人分欄效果
本文實(shí)例為大家分享了Android實(shí)現(xiàn)手機(jī)聯(lián)系人分欄效果的具體代碼,供大家參考,具體內(nèi)容如下
小編在項(xiàng)目時(shí)期遇見了制作手機(jī)聯(lián)系人分欄效果,查詢了很多資料,現(xiàn)在總結(jié)如下:
添加的代碼并不多,用ListView寫好數(shù)據(jù)以后,只需在Adapter里添加一個(gè)方法,并且在getView()方法里添加幾行代碼即可。不過(guò)小編現(xiàn)在介紹的方法,只適合做簡(jiǎn)單項(xiàng)目,大型項(xiàng)目還沒(méi)研究該代碼是否有缺陷,歡迎各位大神批評(píng)指教。
給大家看一下,小編做的代碼效果圖:
adapter具體代碼如下:
public class ContactAdapter extends BaseAdapter<ContactBeen>{ ? ? ? private List<ContactBeen> contactBeens; ? ? ? private Context context; ? ? ? public ContactAdapter(Context context, List<ContactBeen> datas) { ? ? ? ? super(context, datas); ? ? ? ? this.context = context; ? ? ? ? contactBeens = datas; ? ? } ? @Override ? ? public View getView(int position, View convertView, ViewGroup parent) { ? ? ? ? ViewHodler viewHodler = null; ? ? ? ? if(convertView == null){ ? ? ? ? ? ? convertView = inflater.inflate(R.layout.contact_item,parent,false); ? ? ? ? ? ? viewHodler = new ViewHodler(convertView); ? ? ? ? ? ? convertView.setTag(viewHodler); ? ? ? ? }else { ? ? ? ? ? ? viewHodler = (ViewHodler)convertView.getTag(); ? ? ? ? } ? ? ? ? viewHodler.name.setText(contactBeens.get(position).getName()); ? ? ? ? viewHodler.number.setText(contactBeens.get(position).getNumber()); ? ? ? ? viewHodler.image.setmBitmap(Analysis(contactBeens.get(position).getImage())); ? ? ? ? // 獲得當(dāng)前聯(lián)系人名字的首字母。 其中:getAlpha()方法是自己寫的一個(gè)方法(具體介紹如下), contactBeens.get(position).getAlpha()中的getAlpha()是我定義的實(shí)體類的get方法,值為當(dāng)前聯(lián)系人的名字的拼音。 ? ? ? ? String currentStr = getAlpha(contactBeens.get(position).getAlpha()); ? ? ? ? // 獲得上一個(gè)聯(lián)系人名字的首字母 ? ? ? ? String previewStr = (position - 1) >= 0 ? getAlpha(contactBeens.get(position - 1).getAlpha()) : " "; ? ? ? ? /** ? ? ? ? ?* 判斷顯示#、A-Z的TextView隱藏與可見 ? ? ? ? ?*/ ? ? ? ? if (!previewStr.equals(currentStr)) { ? ? ? ? ? ? viewHodler.alpha.setVisibility(View.VISIBLE); ? ? ? ? ? ? viewHodler.alpha.setText(currentStr); ? ? ? ? } else { ? ? ? ? //當(dāng)前聯(lián)系人與上一個(gè)聯(lián)系人首字母相同時(shí),執(zhí)行下面代碼,隱藏alpha(這是我定義的textView)。 ? ? ? ? ? ? viewHodler.alpha.setVisibility(View.GONE); ? ? ? ? } ? ? ? ? return convertView; ? ? } ? ? public class ViewHodler{ ? ? ? ? private ContomImage image; ? ? ? ? private TextView name; ? ? ? ? private TextView number; ? ? ? ? private TextView alpha; ? ? ? ? public ViewHodler(View view) { ? ? ? ? ? ? image = (ContomImage) view.findViewById(R.id.contact_contomImage); ? ? ? ? ? ? name = (TextView) view.findViewById(R.id.contact_name); ? ? ? ? ? ? number = (TextView) view.findViewById(R.id.contact_number); ? ? ? ? ? ? alpha = (TextView) view.findViewById(R.id.alpha); ? ? ? ? } ? ? } ? ? ?//通過(guò)聯(lián)系人的名字str ,返回聯(lián)系人名字的首字母大寫 ? ? @NonNull ? ? private String getAlpha(String str) { ? ? ? ? if (str == null) { ? ? ? ? ? ? return "#"; ? ? ? ? } ? ? ? ? if (str.trim().length() == 0) { ? ? ? ? ? ? return "#"; ? ? ? ? } ? ? ? ? char c = str.trim().substring(0, 1).charAt(0); ? ? ? ? //判斷首字母是否是英文字母 ? ? ? ? if (('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z')) { ? ? ? ? ? ? return (c + "").toUpperCase(); // 大寫輸出 ? ? ? ? } else { ? ? ? ? ? ? return "#"; ? ? ? ? } ? ? } }
適配器代碼解釋如下:
List contactBeens 數(shù)據(jù),是從適配器的構(gòu)造方法傳過(guò)來(lái)的。數(shù)據(jù)是根據(jù)Cursor一條一條的從虛擬機(jī)的聯(lián)系人數(shù)據(jù)庫(kù)讀出來(lái)的。
在適配器代碼中有多處出現(xiàn)getAlpha(),這個(gè)getAlpha()有兩個(gè)含義:
getAlpha(contactBeens.get(position).getAlpha()); 解釋: 從左邊開始,第一次出現(xiàn)的getAlpha()是代碼中最后定義的方法,是自己寫的一個(gè)方法。 第二次出現(xiàn)的getAlpha()是實(shí)體類里的get方法,
現(xiàn)在來(lái)看一下,ContactBeen這個(gè)實(shí)體類里的成員變量:
public class ContactBeen { ? ? private String name; ? ? private String number; ? ? private Uri image; ? ? //該變量存儲(chǔ)從虛擬機(jī)里讀出來(lái)的每個(gè)聯(lián)系人的名字的拼音 ? ? private String alpha; ? ? .... ?//剩下的為上述變量的get 和 ?set方法 以及該類的構(gòu)造方法, 這里就不一一寫出來(lái)了。 }
到這里為止,已經(jīng)實(shí)現(xiàn)了小編今天要說(shuō)的手機(jī)聯(lián)系人分欄效果。如果有任何問(wèn)題,給我留言,看見了一一答復(fù),歡迎各位大神批評(píng)指教。
在這里,小編再給大家展示 : 如何從虛擬機(jī)中獲取手機(jī)聯(lián)系人的方法:
ContentResolver resolver1 = context.getContentResolver(); Cursor cursor1 ?= resolver1.query(uri,null,null,null,"sort_key"); ? if(cursor1 != null && cursor1.moveToFirst()){ ? ? ? ?int indexName = cursor1.getColumnIndex(Phone.DISPLAY_NAME); ? ? ? ?int indexNumber = cursor1.getColumnIndex(Phone.NUMBER); ? ? ? ?int indexId = cursor1.getColumnIndex(Phone.CONTACT_ID); ? ? ? ?int indexPhoneId = cursor1.getColumnIndex(Phone.PHOTO_ID); ? ? ? ?int indexAlpha = ?cursor1.getColumnIndex("sort_key");//"sort_key"保存的是聯(lián)系人名字的拼音字母 ? ? ? ? ? ? ? ? ? ? Uri uri1 = null; ? ? ? ? ? ? ? ? ? ? do { ? ? ? ? ? ? ? ? ? ? ? ? String name = cursor1.getString(indexName); ? ? ? ? ? ? ? ? ? ? ? ? String number = cursor1.getString(indexNumber); ? ? ? ? ? ? ? ? ? ? ? ? Long contactId = cursor1.getLong(indexId); ? ? ? ? ? ? ? ? ? ? ? ? Long phoneId = cursor1.getLong(indexPhoneId); ? ? ? ? ? ? ? ? ? ? ? ? String alpha = cursor1.getString(indexAlpha); ? ? ? ? ? ? ? ? ? ? ? ? if(phoneId > 0){ ? ? ? ? ? ? ? ? ? ? ? ? ? ? uri1 = ContentUris.withAppendedId(Contacts.CONTENT_URI,contactId); ? ? ? ? ? ? ? ? ? ? ? ? }else { ? ? ? ? ? ? ? ? ? ? ? ? ? ? uri1 = null ; ? ? ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? ? ? ContactBeen been = new ContactBeen(name,number,uri1,alpha); ? ? ? ? ? ? ? ? ? ? ? ? Log.d(TAG, "name : "+ name + " number : " + number + " uri1 : " + uri1 + ?"alpha :" + alpha ); ? ? ? ? }while (cursor1.moveToNext()); ? ?cursor1.close(); }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
android shape的使用及漸變色、分割線、邊框、半透明陰影
這篇文章主要介紹了android shape的使用及漸變色、分割線、邊框、半透明陰影,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08Android項(xiàng)目仿UC瀏覽器和360手機(jī)衛(wèi)士消息常駐欄(通知欄)
本篇文章主要介紹了Android項(xiàng)目仿UC瀏覽器和360手機(jī)衛(wèi)士消息常駐欄(通知欄),可以仿照360的通知欄,有興趣的可以了解一下。2016-11-11利用Jetpack Compose繪制可愛的天氣動(dòng)畫
Jetpack Compose是用于構(gòu)建原生Android UI的現(xiàn)代工具包。Jetpack Compose使用更少的代碼,強(qiáng)大的工具和直觀的Kotlin API,簡(jiǎn)化并加速了Android上的UI開發(fā)。本文將利用Jetpack Compose繪制可愛的天氣動(dòng)畫,感興趣的可以了解一下2022-01-01探究Android客戶端網(wǎng)絡(luò)預(yù)連接優(yōu)化機(jī)制
一般情況下,我們都是用一些封裝好的網(wǎng)絡(luò)框架去請(qǐng)求網(wǎng)絡(luò),對(duì)底層實(shí)現(xiàn)不甚關(guān)注,而大部分情況下也不需要特別關(guān)注處理。了解底層的一些實(shí)現(xiàn),有益于我們對(duì)網(wǎng)絡(luò)加載進(jìn)行優(yōu)化。本文就是關(guān)于根據(jù)http的連接復(fù)用機(jī)制來(lái)優(yōu)化網(wǎng)絡(luò)加載速度的原理與細(xì)節(jié)2021-06-06Android開發(fā)筆記之如何正確獲取WebView的網(wǎng)頁(yè)Title
獲取h5頁(yè)面的攜帶的title中是很簡(jiǎn)單的,下面這篇文章主要給大家介紹了關(guān)于Android開發(fā)筆記之如何正確獲取WebView的網(wǎng)頁(yè)Title的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面來(lái)一起看看吧2018-09-09Android Recyclerview實(shí)現(xiàn)水平分頁(yè)GridView效果示例
本篇文章主要介紹了Android Recyclerview實(shí)現(xiàn)水平分頁(yè)GridView效果示例,具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08Android使用Kotlin和RxJava 2.×實(shí)現(xiàn)短信驗(yàn)證碼倒計(jì)時(shí)效果
本篇文章主要介紹了Android使用Kotlin和RxJava 2.×實(shí)現(xiàn)短信驗(yàn)證碼倒計(jì)時(shí)效果,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-12-12Android 訪問(wèn)文件權(quán)限的四種模式介紹
這篇文章主要介紹了Android 訪問(wèn)文件權(quán)限的四種模式介紹的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06Android判斷用戶的網(wǎng)絡(luò)類型實(shí)例講解(2/3/4G、wifi)
這篇文章主要介紹了Android判斷用戶的網(wǎng)絡(luò)類型實(shí)例,用戶的網(wǎng)絡(luò)類型分為2G、3G、4G、wifi,通過(guò)Android如何判斷用戶的網(wǎng)絡(luò)類型,本文為大家揭曉2015-12-12