Android進階:實現連絡人清單滑動顯示提示資訊 以及彈出選擇菜單

來源:互聯網
上載者:User

經常看到一些Contact類的軟體軟體連絡人清單在滾動時會在螢幕中間彈出一個提示資訊,就是當前位置的連絡人序號之類的,嘗試實現了一下

 

先看效果:

 


 

中間彈出的就是一個類似於Overlay的層

 

布局檔案 pop_overlay.xml

 

<?xml version="1.0" encoding="utf-8"?><br /><TextView xmlns:android="http://schemas.android.com/apk/res/android"<br /> android:textSize="70sp"<br /> android:textColor="#99ff00ff"<br /> android:background="#99fff34f"<br /> android:minWidth="80dip"<br /> android:maxWidth="80dip"<br /> android:padding="10dip"<br /> android:gravity="center"<br />/>

 

在onCreate方法中載入這個View並且通過addView加入到Activity中

//滾動時彈出的提示框<br />txtOverlay = (TextView) LayoutInflater.from(this).inflate(R.layout.pop_overlay, null);<br />// 預設設定為不可見。<br /> txtOverlay.setVisibility(View.INVISIBLE);<br /> WindowManager.LayoutParams lp = new WindowManager.LayoutParams(LayoutParams.WRAP_CONTENT,<br /> LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_APPLICATION,<br /> WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,<br /> PixelFormat.TRANSLUCENT);<br /> windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);<br /> windowManager.addView(txtOverlay, lp);

 

然後可以通過實現 ListView.OnScrollListener介面來重寫  onScroll 和 onScrollStateChanged方法

 

boolean visible;</p><p>@Override<br />public void onScroll(AbsListView view, int firstVisibleItem,<br />int visibleItemCount, int totalItemCount) {<br />Log.i("bb", "onScroll");<br />Log.i("bb", "visible:"+visible);<br />int index = cursor.getColumnIndex("display_name");<br />if (visible) {<br />cursor.moveToPosition(firstVisibleItem);<br />String firstChar = Pinyin4j.getFirstChar(cursor.getString(index));<br />txtOverlay.setText(firstChar);<br />txtOverlay.setVisibility(View.VISIBLE);<br /> }<br />}</p><p>@Override<br />public void onScrollStateChanged(AbsListView view, int scrollState) {<br />visible = true;<br />Log.i("bb", "onScrollStateChanged");<br />//在onScrollStateChanged (AbsListView view, int scrollState) 中,scrollState有三種狀態,<br />//分別是開始滾動(SCROLL_STATE_FLING ),正在滾動(SCROLL_STATE_TOUCH_SCROLL ), 已經停止(SCROLL_STATE_IDLE ),<br /> if (scrollState == ListView.OnScrollListener.SCROLL_STATE_IDLE) {<br /> txtOverlay.setVisibility(View.INVISIBLE);<br /> visible = false;<br /> }</p><p>}

 

這兩個方法的調用時機是不同的,可以自己列印看一下

 

這裡顯示的是使用者中文名的首字母  通過 pingyin4j.jar

來實現的 可以下載來試下 還可以設定一些參數的

 

下面是調試代碼:

 

import java.util.HashSet;<br />import java.util.Set;<br />import net.sourceforge.pinyin4j.PinyinHelper;<br />import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;<br />import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;<br />import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;<br />import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;<br />import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;<br />public class Pinyin4j {<br />/**<br /> * 字串集合轉換字串(逗號分隔)<br /> */<br />public static String makeStringByStringSet(Set<String> stringSet) {<br />StringBuilder str = new StringBuilder();<br />int i = 0;<br />for (String s : stringSet) {<br />if (i == stringSet.size() - 1) {<br />str.append(s);<br />} else {<br />str.append(s + ",");<br />}<br />i++;<br />}<br />return str.toString().toLowerCase();<br />}<br />/**<br /> * 擷取拼音集合<br /> */<br />public static Set<String> getPinyin(String src) {<br />if (src != null && !src.trim().equalsIgnoreCase("")) {<br />char[] srcChar;<br />srcChar = src.toCharArray();<br />// 漢語拼音格式輸出類<br />HanyuPinyinOutputFormat hanYuPinOutputFormat = new HanyuPinyinOutputFormat();<br />// 輸出設定,大小寫,音標方式等<br />hanYuPinOutputFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);<br />hanYuPinOutputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);<br />hanYuPinOutputFormat.setVCharType(HanyuPinyinVCharType.WITH_V);<br />String[][] temp = new String[src.length()][];<br />for (int i = 0; i < srcChar.length; i++) {<br />char c = srcChar[i];<br />// 是中文或者a-z或者A-Z轉換拼音(我的需求,是保留中文或者a-z或者A-Z)<br />if (String.valueOf(c).matches("[//u4E00-//u9FA5]+")) {<br />try {<br />temp[i] = PinyinHelper.toHanyuPinyinStringArray(<br />srcChar[i], hanYuPinOutputFormat);<br />} catch (BadHanyuPinyinOutputFormatCombination e) {<br />e.printStackTrace();<br />}<br />} else if (((int) c >= 65 && (int) c <= 90)<br />|| ((int) c >= 97 && (int) c <= 122)) {<br />temp[i] = new String[] { String.valueOf(srcChar[i]) };<br />} else {<br />temp[i] = new String[] { "" };<br />}<br />}<br />String[] pingyinArray = Exchange(temp);<br />Set<String> pinyinSet = new HashSet<String>();<br />for (int i = 0; i < pingyinArray.length; i++) {<br />pinyinSet.add(pingyinArray[i]);<br />}<br />return pinyinSet;<br />}<br />return null;<br />}<br />/**<br /> * 遞迴<br /> */<br />public static String[] Exchange(String[][] strJaggedArray) {<br />String[][] temp = DoExchange(strJaggedArray);<br />return temp[0];<br />}<br />/**<br /> * 遞迴<br /> */<br />private static String[][] DoExchange(String[][] strJaggedArray) {<br />int len = strJaggedArray.length;<br />if (len >= 2) {<br />int len1 = strJaggedArray[0].length;<br />int len2 = strJaggedArray[1].length;<br />int newlen = len1 * len2;<br />String[] temp = new String[newlen];<br />int Index = 0;<br />for (int i = 0; i < len1; i++) {<br />for (int j = 0; j < len2; j++) {<br />temp[Index] = strJaggedArray[0][i] + strJaggedArray[1][j];<br />Index++;<br />}<br />}<br />String[][] newArray = new String[len - 1][];<br />for (int i = 2; i < len; i++) {<br />newArray[i - 1] = strJaggedArray[i];<br />}<br />newArray[0] = temp;<br />return DoExchange(newArray);<br />} else {<br />return strJaggedArray;<br />}<br />}<br />public static String getFirstChar(String str) {<br />return makeStringByStringSet(getPinyin(str)).substring(0, 1);<br />}<br />/**<br /> * @param args<br /> */<br />public static void main(String[] args) {<br />String str = "測試";<br />System.out.println(makeStringByStringSet(getPinyin(str)));<br />}<br />}

 

 

下面看快顯功能表的建立

 

//監聽條目單擊事件<br />listView.setOnItemClickListener(new OnItemClickListener(){<br />@Override<br />public void onItemClick(AdapterView<?> parent, View view,<br />int position, long id) {<br />TextView tv = (TextView)view.findViewById(R.id.phonename);<br />Toast.makeText(ListViewDemo.this, tv.getText(), Toast.LENGTH_LONG).show();<br />}</p><p>});<br />listView.setOnItemLongClickListener(new OnItemLongClickListener(){<br />@Override<br />public boolean onItemLongClick(AdapterView<?> parent, View view,<br />int position, long id) {<br />Toast.makeText(ListViewDemo.this, "長按一次", Toast.LENGTH_LONG).show();<br />return false;//如果返回true 就不會調用下面onCreateContextMenu事件<br />}</p><p>});</p><p>//長按快顯功能表選項的點擊選擇事件監聽<br />final OnMenuItemClickListener mOnMenuItemClickListener = new OnMenuItemClickListener(){<br />@Override<br />public boolean onMenuItemClick(MenuItem item) {<br />switch (item.getItemId()) {<br />case 0:<br />Toast.makeText(ListViewDemo.this, "test1", Toast.LENGTH_LONG).show();<br />break;<br />case 1:<br />Toast.makeText(ListViewDemo.this, "test2", Toast.LENGTH_LONG).show();<br />break;<br />case 2:<br />Toast.makeText(ListViewDemo.this, "test3", Toast.LENGTH_LONG).show();<br />break;<br />case 3:<br />Toast.makeText(ListViewDemo.this, "test4", Toast.LENGTH_LONG).show();<br />break;<br />}<br />return false;<br />}</p><p>};</p><p>//監聽長按事件 長按時彈出選擇菜單<br />listView.setOnCreateContextMenuListener(new OnCreateContextMenuListener(){<br />@Override<br />public void onCreateContextMenu(ContextMenu menu, View view,ContextMenuInfo arg2) {</p><p>menu.setHeaderTitle("提示框");<br />menu.add(0, 0, 0, "test1").setOnMenuItemClickListener(mOnMenuItemClickListener);<br />menu.add(0, 1, 1, "test2").setOnMenuItemClickListener(mOnMenuItemClickListener);<br />menu.add(0, 2, 2, "test3").setOnMenuItemClickListener(mOnMenuItemClickListener);<br />menu.add(0, 3, 3, "test4").setOnMenuItemClickListener(mOnMenuItemClickListener);<br />}</p><p>});

 

效果如,這裡就有ListView種的幾個點擊事件



首先是單擊事件 通過setOnItemClickListener 來監聽



長按事件 通過 setOnItemLongClickListener 來監聽 如果是長按就可以通過setOnCreateContextMenuListener這個事件來建立快顯功能表,注意如果要通過這種方式建立菜單需要在onItemLongClick方法中返回false

 

通過setOnCreateContextMenuListener事件來監聽快顯功能表的點擊事件

 

總之這裡有N多的事件

 

還有一點看一下ListView的每個條目Item實現點擊切換底色的效果

 

 

點擊是底色變成如果的顏色



這個可以在Item的布局檔案中實現  來看布局檔案 listviewdemoitem.xml

 

<?xml version="1.0" encoding="utf-8"?><br /><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"<br /> android:orientation="horizontal"<br /> android:layout_width="fill_parent"<br /> android:layout_height="fill_parent"<br /> android:background="#ffffff"<br /> ><br /> <RelativeLayout<br /> android:layout_width="wrap_content"<br /> android:layout_height="fill_parent"<br /> android:background="@drawable/listview_selected"<br /> android:padding="6px"<br /> ><br /> <TextView<br /> android:id="@+id/phonename"<br /> android:layout_width="fill_parent"<br /> android:layout_height="wrap_content"<br /> android:textSize="20px"<br /> android:textColor="#000000"<br /> /><br /> <TextView<br /> android:layout_below="@id/phonename"<br /> android:id="@+id/phonenumber"<br /> android:layout_width="fill_parent"<br /> android:layout_height="wrap_content"<br /> android:textSize="16px"<br /> android:textColor="#000000"<br /> /><br /> <ImageView<br /> android:layout_alignParentRight="true"<br /> android:layout_width="wrap_content"<br /> android:layout_height="wrap_content"<br /> android:src="@drawable/menu_city_manager"<br /> android:layout_gravity="right"<br /> /><br /> </RelativeLayout><br /></LinearLayout>

 

外面是一個LinerLayout 作為底色 防止滾動的時候底色變成黑色

 

裡面用一個RelativeLayout實現了布局調整,它的android:background="@drawable/listview_selected"  屬性通過一個Selector

 

來實現焦點 點擊等操作時的背景切換

<?xml version="1.0" encoding="utf-8"?><br /><selector xmlns:android="http://schemas.android.com/apk/res/android"><br /> <item android:state_pressed="true" android:drawable="@drawable/list_selector_background_pressed" /><br /></selector>

 

這裡簡單實現了一下,還可以有其他的設定 譬如 android:state_focus等

 

 



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.