friend.xml

**[java]** [view plain](http://blog.csdn.net/csh159/article/details/8955029#)[copy](http://blog.csdn.net/csh159/article/details/8955029#)[print](http://blog.csdn.net/csh159/article/details/8955029#)[?](http://blog.csdn.net/csh159/article/details/8955029#)
  <div>
    <embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="29" height="15" align="middle" name="ZeroClipboardMovie_1">
    </embed>
  </div>
</div>
- <?xml version=<span class="string">&#8220;1.0&#8221;</span> encoding=<span class="string">&#8220;utf-8&#8221;</span>?>

- <LinearLayout xmlns:android=<span class="string">&#8220;http://schemas.android.com/apk/res/android&#8221;</span>

- android:layout_width=<span class="string">&#8220;match_parent&#8221;</span>

- android:layout_height=<span class="string">&#8220;match_parent&#8221;</span>

- android:orientation=<span class="string">&#8220;vertical&#8221;</span> >

- <RelativeLayout

- android:layout_width=<span class="string">&#8220;fill_parent&#8221;</span>

- android:layout_height=<span class="string">&#8220;fill_parent&#8221;</span>

- android:orientation=<span class="string">&#8220;vertical&#8221;</span> >

- 
- <ListView

- android:id=<span class="string">&#8220;@+id/list_view&#8221;</span>

- android:layout_width=<span class="string">&#8220;fill_parent&#8221;</span>

- android:layout_height=<span class="string">&#8220;wrap_content&#8221;</span>

- android:scrollbars=<span class="string">&#8220;none&#8221;</span> >

- </ListView>

- 
- <com.example.menu.MyLetterListView

- android:id=<span class="string">&#8220;@+id/my_list_view&#8221;</span>

- android:layout_width=<span class="string">&#8220;30dip&#8221;</span>

- android:layout_height=<span class="string">&#8220;fill_parent&#8221;</span>

- android:layout_alignParentRight=<span class="string">&#8220;true&#8221;</span>

- />

- </RelativeLayout>

- 
- </LinearLayout>

friend_header.xml

**[html]** [view plain](http://blog.csdn.net/csh159/article/details/8955029#)[copy](http://blog.csdn.net/csh159/article/details/8955029#)[print](http://blog.csdn.net/csh159/article/details/8955029#)[?](http://blog.csdn.net/csh159/article/details/8955029#)
  <div>
    <embed id="ZeroClipboardMovie_2" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="29" height="15" align="middle" name="ZeroClipboardMovie_2">
    </embed>
  </div>
</div>
- <span class="tag"><?</span><span class="tag-name">xml</span> <span class="attribute">version</span>=<span class="attribute-value">&#8220;1.0&#8221;</span> <span class="attribute">encoding</span>=<span class="attribute-value">&#8220;utf-8&#8221;</span><span class="tag">?></span>

- <span class="tag"><</span><span class="tag-name">FrameLayout</span> <span class="attribute">xmlns:android</span>=<span class="attribute-value">&#8220;http://schemas.android.com/apk/res/android&#8221;</span>

- <span class="attribute">android:layout_width</span>=<span class="attribute-value">&#8220;fill_parent&#8221;</span>

- <span class="attribute">android:layout_height</span>=<span class="attribute-value">&#8220;wrap_content&#8221;</span>

- <span class="attribute">android:gravity</span>=<span class="attribute-value">&#8220;center_vertical&#8221;</span>

- <span class="attribute">android:orientation</span>=<span class="attribute-value">&#8220;horizontal&#8221;</span>

- <span class="attribute">android:paddingLeft</span>=<span class="attribute-value">&#8220;2dip&#8221;</span>

- <span class="attribute">android:paddingRight</span>=<span class="attribute-value">&#8220;2dip&#8221;</span> <span class="tag">></span>

- 
- <span class="tag"><</span><span class="tag-name">TextView</span>

- <span class="attribute">android:id</span>=<span class="attribute-value">&#8220;@+id/friend_search_head_title&#8221;</span>

- <span class="attribute">android:layout_width</span>=<span class="attribute-value">&#8220;wrap_content&#8221;</span>

- <span class="attribute">android:layout_height</span>=<span class="attribute-value">&#8220;wrap_content&#8221;</span>

- <span class="attribute">android:layout_gravity</span>=<span class="attribute-value">&#8220;center&#8221;</span>

- <span class="attribute">android:clickable</span>=<span class="attribute-value">&#8220;true&#8221;</span>

- <span class="attribute">android:textSize</span>=<span class="attribute-value">&#8220;20sp&#8221;</span> <span class="tag">></span>

- <span class="tag"></</span><span class="tag-name">TextView</span><span class="tag">></span>

- 
- <span class="tag"><</span><span class="tag-name">ImageView</span>

- <span class="attribute">android:id</span>=<span class="attribute-value">&#8220;@+id/friend_center_back&#8221;</span>

- <span class="attribute">android:layout_width</span>=<span class="attribute-value">&#8220;wrap_content&#8221;</span>

- <span class="attribute">android:layout_height</span>=<span class="attribute-value">&#8220;wrap_content&#8221;</span>

- <span class="attribute">android:layout_gravity</span>=<span class="attribute-value">&#8220;right|center&#8221;</span>

- <span class="attribute">android:clickable</span>=<span class="attribute-value">&#8220;true&#8221;</span> <span class="tag">></span>

- <span class="tag"></</span><span class="tag-name">ImageView</span><span class="tag">></span>

- <span class="tag"></</span><span class="tag-name">FrameLayout</span><span class="tag">></span>

list_item.xml

**[html]** [view plain](http://blog.csdn.net/csh159/article/details/8955029#)[copy](http://blog.csdn.net/csh159/article/details/8955029#)[print](http://blog.csdn.net/csh159/article/details/8955029#)[?](http://blog.csdn.net/csh159/article/details/8955029#)
  <div>
    <embed id="ZeroClipboardMovie_3" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="29" height="15" align="middle" name="ZeroClipboardMovie_3">
    </embed>
  </div>
</div>
- <span class="tag"><?</span><span class="tag-name">xml</span> <span class="attribute">version</span>=<span class="attribute-value">&#8220;1.0&#8221;</span> <span class="attribute">encoding</span>=<span class="attribute-value">&#8220;UTF-8&#8221;</span><span class="tag">?></span>

- <span class="tag"><</span><span class="tag-name">RelativeLayout</span> <span class="attribute">xmlns:android</span>=<span class="attribute-value">&#8220;http://schemas.android.com/apk/res/android&#8221;</span>

- <span class="attribute">android:layout_width</span>=<span class="attribute-value">&#8220;match_parent&#8221;</span>

- <span class="attribute">android:layout_height</span>=<span class="attribute-value">&#8220;match_parent&#8221;</span> <span class="tag">></span>

- 
- <span class="tag"><</span><span class="tag-name">TextView</span>

- <span class="attribute">android:id</span>=<span class="attribute-value">&#8220;@+id/alpha&#8221;</span>

- <span class="attribute">android:layout_width</span>=<span class="attribute-value">&#8220;fill_parent&#8221;</span>

- <span class="attribute">android:layout_height</span>=<span class="attribute-value">&#8220;wrap_content&#8221;</span>

- <span class="attribute">android:background</span>=<span class="attribute-value">&#8220;#333333&#8221;</span>

- <span class="attribute">android:paddingLeft</span>=<span class="attribute-value">&#8220;10dip&#8221;</span>

- <span class="attribute">android:textColor</span>=<span class="attribute-value">&#8220;#FFFFFF&#8221;</span>

- <span class="attribute">android:visibility</span>=<span class="attribute-value">&#8220;gone&#8221;</span> <span class="tag">/></span>

- 
- <span class="tag"><</span><span class="tag-name">ImageView</span>

- <span class="attribute">android:id</span>=<span class="attribute-value">&#8220;@+id/imageView&#8221;</span>

- <span class="attribute">android:layout_width</span>=<span class="attribute-value">&#8220;wrap_content&#8221;</span>

- <span class="attribute">android:layout_height</span>=<span class="attribute-value">&#8220;wrap_content&#8221;</span>

- <span class="attribute">android:layout_alignParentLeft</span>=<span class="attribute-value">&#8220;true&#8221;</span>

- <span class="attribute">android:background</span>=<span class="attribute-value">&#8220;@drawable/contact_list_icon&#8221;</span>

- <span class="attribute">android:layout_below</span>=<span class="attribute-value">&#8220;@id/alpha&#8221;</span> <span class="tag">/></span>

- 
- <span class="tag"><</span><span class="tag-name">View</span>

- <span class="attribute">android:id</span>=<span class="attribute-value">&#8220;@+id/divider&#8221;</span>

- <span class="attribute">android:layout_width</span>=<span class="attribute-value">&#8220;1.0dip&#8221;</span>

- <span class="attribute">android:layout_height</span>=<span class="attribute-value">&#8220;fill_parent&#8221;</span>

- <span class="attribute">android:layout_below</span>=<span class="attribute-value">&#8220;@id/alpha&#8221;</span>

- <span class="attribute">android:layout_marginRight</span>=<span class="attribute-value">&#8220;11.0dip&#8221;</span>

- <span class="attribute">android:layout_toRightOf</span>=<span class="attribute-value">&#8220;@id/imageView&#8221;</span> <span class="tag">/></span>

- 
- <span class="tag"><</span><span class="tag-name">TextView</span>

- <span class="attribute">android:id</span>=<span class="attribute-value">&#8220;@+id/name&#8221;</span>

- <span class="attribute">android:layout_width</span>=<span class="attribute-value">&#8220;wrap_content&#8221;</span>

- <span class="attribute">android:layout_height</span>=<span class="attribute-value">&#8220;wrap_content&#8221;</span>

- <span class="attribute">android:layout_alignTop</span>=<span class="attribute-value">&#8220;@id/divider&#8221;</span>

- <span class="attribute">android:layout_marginLeft</span>=<span class="attribute-value">&#8220;2.0dip&#8221;</span>

- <span class="attribute">android:layout_marginRight</span>=<span class="attribute-value">&#8220;5.0dip&#8221;</span>

- <span class="attribute">android:layout_marginTop</span>=<span class="attribute-value">&#8220;6.0dip&#8221;</span>

- <span class="attribute">android:layout_toRightOf</span>=<span class="attribute-value">&#8220;@id/divider&#8221;</span>

- <span class="attribute">android:singleLine</span>=<span class="attribute-value">&#8220;true&#8221;</span>

- <span class="attribute">android:textAppearance</span>=<span class="attribute-value">&#8220;?android:textAppearanceMedium&#8221;</span> <span class="tag">/></span>

- 
- <span class="tag"><</span><span class="tag-name">TextView</span>

- <span class="attribute">android:id</span>=<span class="attribute-value">&#8220;@+id/number&#8221;</span>

- <span class="attribute">android:layout_width</span>=<span class="attribute-value">&#8220;wrap_content&#8221;</span>

- <span class="attribute">android:layout_height</span>=<span class="attribute-value">&#8220;wrap_content&#8221;</span>

- <span class="attribute">android:layout_alignLeft</span>=<span class="attribute-value">&#8220;@id/name&#8221;</span>

- <span class="attribute">android:layout_alignWithParentIfMissing</span>=<span class="attribute-value">&#8220;true&#8221;</span>

- <span class="attribute">android:layout_below</span>=<span class="attribute-value">&#8220;@id/name&#8221;</span>

- <span class="attribute">android:ellipsize</span>=<span class="attribute-value">&#8220;marquee&#8221;</span>

- <span class="attribute">android:singleLine</span>=<span class="attribute-value">&#8220;true&#8221;</span>

- <span class="attribute">android:textAppearance</span>=<span class="attribute-value">&#8220;?android:textAppearanceSmall&#8221;</span> <span class="tag">/></span>

- 
- <span class="tag"></</span><span class="tag-name">RelativeLayout</span><span class="tag">></span>

overlay.xml

**[html]** [view plain](http://blog.csdn.net/csh159/article/details/8955029#)[copy](http://blog.csdn.net/csh159/article/details/8955029#)[print](http://blog.csdn.net/csh159/article/details/8955029#)[?](http://blog.csdn.net/csh159/article/details/8955029#)
  <div>
    <embed id="ZeroClipboardMovie_4" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="29" height="15" align="middle" name="ZeroClipboardMovie_4">
    </embed>
  </div>
</div>
- <span class="tag"><?</span><span class="tag-name">xml</span> <span class="attribute">version</span>=<span class="attribute-value">&#8220;1.0&#8221;</span> <span class="attribute">encoding</span>=<span class="attribute-value">&#8220;utf-8&#8221;</span><span class="tag">?></span>

- <span class="tag"><</span><span class="tag-name">TextView</span> <span class="attribute">xmlns:android</span>=<span class="attribute-value">&#8220;http://schemas.android.com/apk/res/android&#8221;</span>

- <span class="attribute">android:layout_width</span>=<span class="attribute-value">&#8220;match_parent&#8221;</span>

- <span class="attribute">android:layout_height</span>=<span class="attribute-value">&#8220;match_parent&#8221;</span>

- <span class="attribute">android:orientation</span>=<span class="attribute-value">&#8220;vertical&#8221;</span> <span class="tag">></span>

- 
- 
- <span class="tag"></</span><span class="tag-name">TextView</span><span class="tag">></span>

suspend_search.xml

**[html]** [view plain](http://blog.csdn.net/csh159/article/details/8955029#)[copy](http://blog.csdn.net/csh159/article/details/8955029#)[print](http://blog.csdn.net/csh159/article/details/8955029#)[?](http://blog.csdn.net/csh159/article/details/8955029#)
  <div>
    <embed id="ZeroClipboardMovie_5" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="29" height="15" align="middle" name="ZeroClipboardMovie_5">
    </embed>
  </div>
</div>
- <span class="tag"><?</span><span class="tag-name">xml</span> <span class="attribute">version</span>=<span class="attribute-value">&#8220;1.0&#8221;</span> <span class="attribute">encoding</span>=<span class="attribute-value">&#8220;utf-8&#8221;</span><span class="tag">?></span>

- <span class="tag"><</span><span class="tag-name">ImageView</span> <span class="attribute">xmlns:android</span>=<span class="attribute-value">&#8220;http://schemas.android.com/apk/res/android&#8221;</span>

- <span class="attribute">android:layout_width</span>=<span class="attribute-value">&#8220;match_parent&#8221;</span>

- <span class="attribute">android:layout_height</span>=<span class="attribute-value">&#8220;match_parent&#8221;</span>

- <span class="attribute">android:orientation</span>=<span class="attribute-value">&#8220;vertical&#8221;</span> <span class="tag">></span>

- 
- <span class="tag"></</span><span class="tag-name">ImageView</span><span class="tag">></span>

Friend.java

**[java]** [view plain](http://blog.csdn.net/csh159/article/details/8955029#)[copy](http://blog.csdn.net/csh159/article/details/8955029#)[print](http://blog.csdn.net/csh159/article/details/8955029#)[?](http://blog.csdn.net/csh159/article/details/8955029#)
  <div>
    <embed id="ZeroClipboardMovie_6" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="29" height="15" align="middle" name="ZeroClipboardMovie_6">
    </embed>
  </div>
</div>
- <span class="keyword">package</span> com.example.menu;

- 
- <span class="keyword">import</span> java.util.ArrayList;

- <span class="keyword">import</span> java.util.HashMap;

- <span class="keyword">import</span> java.util.List;

- <span class="keyword">import</span> java.util.regex.Pattern;

- 
- <span class="keyword">import</span> com.example.menu.MyLetterListView.OnTouchingLetterChangedListener;

- 
- <span class="keyword">import</span> android.app.Activity;

- <span class="keyword">import</span> android.content.AsyncQueryHandler;

- <span class="keyword">import</span> android.content.ComponentName;

- <span class="keyword">import</span> android.content.ContentResolver;

- <span class="keyword">import</span> android.content.ContentValues;

- <span class="keyword">import</span> android.content.Context;

- <span class="keyword">import</span> android.content.Intent;

- <span class="keyword">import</span> android.database.Cursor;

- <span class="keyword">import</span> android.graphics.PixelFormat;

- <span class="keyword">import</span> android.net.Uri;

- <span class="keyword">import</span> android.os.Bundle;

- <span class="keyword">import</span> android.os.Handler;

- <span class="keyword">import</span> android.provider.ContactsContract;

- <span class="keyword">import</span> android.util.Log;

- <span class="keyword">import</span> android.view.LayoutInflater;

- <span class="keyword">import</span> android.view.View;

- <span class="keyword">import</span> android.view.View.OnClickListener;

- <span class="keyword">import</span> android.view.ViewGroup;

- <span class="keyword">import</span> android.view.Window;

- <span class="keyword">import</span> android.view.WindowManager;

- <span class="keyword">import</span> android.widget.AbsListView;

- <span class="keyword">import</span> android.widget.AbsListView.OnScrollListener;

- <span class="keyword">import</span> android.widget.BaseAdapter;

- <span class="keyword">import</span> android.widget.ImageView;

- <span class="keyword">import</span> android.widget.ListView;

- <span class="keyword">import</span> android.widget.TextView;

- <span class="keyword">import</span> android.widget.Toast;

- 
- <span class="keyword">public</span> <span class="keyword">class</span> Friend <span class="keyword">extends</span> Activity

- {

- 
- <span class="keyword">private</span> BaseAdapter adapter;

- 
- <span class="keyword">private</span> ListView listview;

- 
- <span class="keyword">private</span> TextView overlay;

- 
- <span class="keyword">private</span> ImageView suspend_search;

- 
- <span class="keyword">private</span> MyLetterListView letterListView;

- 
- <span class="keyword">private</span> AsyncQueryHandler asyncQuery;

- 
- <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> String NAME = <span class="string">&#8220;name&#8221;</span>, NUMBER = <span class="string">&#8220;number&#8221;</span>,

- SORT_KEY = <span class="string">&#8220;sort_key&#8221;</span>;

- 
- <span class="keyword">private</span> HashMap<String, Integer> alphaIndexer;

- 
- <span class="keyword">private</span> String[] sections;

- 
- <span class="keyword">public</span> List<ContentValues> list = <span class="keyword">new</span> ArrayList<ContentValues>();

- 
- <span class="keyword">private</span> WindowManager windowManager;

- 
- <span class="annotation">@Override</span>

- <span class="keyword">public</span> <span class="keyword">void</span> onCreate(Bundle savedInstanceState)

- {

- <span class="keyword">super</span>.onCreate(savedInstanceState);

- requestWindowFeature(Window.FEATURE_NO_TITLE);

- setContentView(R.layout.friend);

- windowManager =

- (WindowManager) <span class="keyword">this</span>.getSystemService(Context.WINDOW_SERVICE);

- asyncQuery = <span class="keyword">new</span> MyAsyncQueryHandler(getContentResolver());

- listview = (ListView) findViewById(R.id.list_view);

- letterListView = (MyLetterListView) findViewById(R.id.my_list_view);

- letterListView

- .setOnTouchingLetterChangedListener(<span class="keyword">new</span> LetterListViewListener());

- 
- alphaIndexer = <span class="keyword">new</span> HashMap<String, Integer>();

- <span class="keyword">new</span> Handler();

- <span class="keyword">new</span> OverlayThread();

- initOverlay();

- initSuSearch();

- <span class="keyword">if</span> (list.size() > <span class="number"></span>)

- {

- }

- 
- listview.setOnScrollListener(<span class="keyword">new</span> OnScrollListener()

- {

- 
- <span class="annotation">@Override</span>

- <span class="keyword">public</span> <span class="keyword">void</span> onScrollStateChanged(AbsListView view, <span class="keyword">int</span> scrollState)

- {

- suspend_search.setVisibility(View.VISIBLE);

- }

- 
- <span class="annotation">@Override</span>

- <span class="keyword">public</span> <span class="keyword">void</span> onScroll(AbsListView view, <span class="keyword">int</span> firstVisibleItem,

- <span class="keyword">int</span> visibleItemCount, <span class="keyword">int</span> totalItemCount)

- {

- suspend_search.setVisibility(View.GONE);

- }

- });

- suspend_search.setOnClickListener(<span class="keyword">new</span> OnClickListener()

- {

- 
- <span class="annotation">@Override</span>

- <span class="keyword">public</span> <span class="keyword">void</span> onClick(View v)

- {

- ComponentName friendcName =

- <span class="keyword">new</span> ComponentName(Friend.<span class="keyword">this</span>,

- <span class="string">&#8220;com.example.test_intent.FriendSearch&#8221;</span>);

- Intent friend_viewIntent = <span class="keyword">new</span> Intent();

- friend_viewIntent.setComponent(friendcName);

- startActivity(friend_viewIntent);

- Toast.makeText(getApplicationContext(), <span class="string">&#8220;sousuo&#8221;</span>,

- Toast.LENGTH_LONG).show();

- <span class="comment">// TODO Auto-generated method stub</span>

- }

- });

- }

- 
- <span class="annotation">@SuppressWarnings</span>(<span class="string">&#8220;deprecation&#8221;</span>)

- <span class="keyword">public</span> <span class="keyword">void</span> getContent()

- {

- Cursor cur =

- getContentResolver().query(

- ContactsContract.Contacts.CONTENT_URI, <span class="keyword">null</span>, <span class="keyword">null</span>,

- <span class="keyword">null</span>, <span class="keyword">null</span>);

- startManagingCursor(cur);

- }

- 
- <span class="annotation">@Override</span>

- <span class="keyword">protected</span> <span class="keyword">void</span> onResume()

- {

- <span class="keyword">super</span>.onResume();

- Uri uri = Uri.parse(<span class="string">&#8220;content://com.android.contacts/data/phones&#8221;</span>);

- String[] projection = { <span class="string">&#8220;_id&#8221;</span>, <span class="string">&#8220;display_name&#8221;</span>, <span class="string">&#8220;data1&#8221;</span>, <span class="string">&#8220;sort_key&#8221;</span> };

- asyncQuery.startQuery(<span class="number"></span>, <span class="keyword">null</span>, uri, projection, <span class="keyword">null</span>, <span class="keyword">null</span>,

- <span class="string">&#8220;sort_key COLLATE LOCALIZED asc&#8221;</span>);

- }

- 
- <span class="keyword">private</span> <span class="keyword">class</span> MyAsyncQueryHandler <span class="keyword">extends</span> AsyncQueryHandler

- {

- 
- <span class="keyword">public</span> MyAsyncQueryHandler(ContentResolver cr)

- {

- <span class="keyword">super</span>(cr);

- }

- 
- <span class="annotation">@Override</span>

- <span class="keyword">protected</span> <span class="keyword">void</span> onQueryComplete(<span class="keyword">int</span> token, Object cookie, Cursor cursor)

- {

- 
- cursor.moveToFirst();

- Log.d(<span class="string">&#8220;ccccc&#8221;</span>,

- cursor.getString(<span class="number"></span>) + <span class="string">&#8221; 000 &#8220;</span> + cursor.getString(<span class="number">1</span>)

- + <span class="string">&#8221; 000 &#8220;</span> + cursor.getString(<span class="number">2</span>) + <span class="string">&#8221; 000 &#8220;</span>

- + cursor.getString(<span class="number">3</span>));

- 
- <span class="keyword">while</span> (cursor.moveToNext())

- {

- ContentValues cv = <span class="keyword">new</span> ContentValues();

- cv.put(NAME, cursor.getString(<span class="number">1</span>));

- cv.put(NUMBER, cursor.getString(<span class="number">2</span>));

- cv.put(SORT_KEY, cursor.getString(<span class="number">3</span>));

- list.add(cv);

- }

- <span class="keyword">if</span> (list.size() > <span class="number"></span>)

- {

- setAdapter(list);

- }

- }

- 
- }

- 
- <span class="keyword">private</span> <span class="keyword">void</span> setAdapter(List<ContentValues> list)

- {

- adapter = <span class="keyword">new</span> ListAdapter(<span class="keyword">this</span>, list);

- listview.setAdapter(adapter);

- 
- }

- 
- <span class="keyword">private</span> <span class="keyword">class</span> ListAdapter <span class="keyword">extends</span> BaseAdapter

- {

- 
- <span class="keyword">private</span> LayoutInflater inflater;

- 
- <span class="keyword">private</span> List<ContentValues> list;

- 
- <span class="keyword">public</span> ListAdapter(Context context, List<ContentValues> list)

- {

- <span class="keyword">this</span>.inflater = LayoutInflater.from(context);

- <span class="keyword">this</span>.list = list;

- alphaIndexer = <span class="keyword">new</span> HashMap<String, Integer>();

- sections = <span class="keyword">new</span> String[list.size()];

- 
- <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number"></span>; i < list.size(); i++)

- {

- String currentStr = getAlpha(list.get(i).getAsString(SORT_KEY));

- String previewStr =

- (i &#8211; <span class="number">1</span>) >= <span class="number"></span> ? getAlpha(list.get(i &#8211; <span class="number">1</span>).getAsString(

- SORT_KEY)) : <span class="string">&#8221; &#8220;</span>;

- <span class="keyword">if</span> (!previewStr.equals(currentStr))

- {

- String name = getAlpha(list.get(i).getAsString(SORT_KEY));

- alphaIndexer.put(name, i);

- sections[i] = name;

- }

- }

- }

- 
- <span class="annotation">@Override</span>

- <span class="keyword">public</span> <span class="keyword">int</span> getCount()

- {

- <span class="keyword">return</span> list.size();

- }

- 
- <span class="annotation">@Override</span>

- <span class="keyword">public</span> Object getItem(<span class="keyword">int</span> position)

- {

- <span class="keyword">return</span> list.get(position);

- }

- 
- <span class="annotation">@Override</span>

- <span class="keyword">public</span> <span class="keyword">long</span> getItemId(<span class="keyword">int</span> position)

- {

- <span class="keyword">return</span> position;

- }

- 
- <span class="annotation">@Override</span>

- <span class="keyword">public</span> View getView(<span class="keyword">int</span> position, View convertView, ViewGroup parent)

- {

- ViewHolder holder;

- 
- <span class="keyword">if</span> (convertView == <span class="keyword">null</span>)

- {

- convertView = inflater.inflate(R.layout.list_item, <span class="keyword">null</span>);

- holder = <span class="keyword">new</span> ViewHolder();

- holder.alpha = (TextView) convertView.findViewById(R.id.alpha);

- holder.name = (TextView) convertView.findViewById(R.id.name);

- holder.number =

- (TextView) convertView.findViewById(R.id.number);

- convertView.setTag(holder);

- }

- <span class="keyword">else</span>

- {

- holder = (ViewHolder) convertView.getTag();

- }

- 
- ContentValues cv = list.get(position);

- holder.name.setText(cv.getAsString(NAME));

- holder.number.setText(cv.getAsString(NUMBER));

- String currentStr =

- getAlpha(list.get(position).getAsString(SORT_KEY));

- String previewStr =

- (position &#8211; <span class="number">1</span>) >= <span class="number"></span> ? getAlpha(list.get(position &#8211; <span class="number">1</span>)

- .getAsString(SORT_KEY)) : <span class="string">&#8221; &#8220;</span>;

- 
- <span class="keyword">if</span> (!previewStr.equals(currentStr))

- {

- holder.alpha.setVisibility(View.VISIBLE);

- holder.alpha.setText(currentStr);

- }

- <span class="keyword">else</span>

- {

- holder.alpha.setVisibility(View.GONE);

- }

- 
- <span class="keyword">return</span> convertView;

- }

- 
- <span class="keyword">private</span> <span class="keyword">class</span> ViewHolder

- {

- 
- TextView alpha;

- 
- TextView name;

- 
- TextView number;

- }

- }

- 
- <span class="keyword">private</span> <span class="keyword">void</span> initSuSearch()<span class="comment">// 搜索</span>

- {

- LayoutInflater inflater = LayoutInflater.from(<span class="keyword">this</span>);

- suspend_search =

- (ImageView) inflater.inflate(R.layout.suspend_search, <span class="keyword">null</span>);

- WindowManager.LayoutParams lp =

- <span class="keyword">new</span> WindowManager.LayoutParams(<span class="number">80</span>, <span class="number">80</span>, <span class="number">170</span>, &#8211;<span class="number">280</span>,

- WindowManager.LayoutParams.TYPE_APPLICATION,

- WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,

- PixelFormat.TRANSLUCENT);

- windowManager.addView(suspend_search, lp);

- }

- 
- <span class="keyword">private</span> <span class="keyword">void</span> initOverlay()

- {

- LayoutInflater inflater = LayoutInflater.from(<span class="keyword">this</span>);

- overlay = (TextView) inflater.inflate(R.layout.overlay, <span class="keyword">null</span>);

- WindowManager.LayoutParams lp =

- <span class="keyword">new</span> WindowManager.LayoutParams(

- <span class="number">120</span>,

- <span class="number">120</span>,

- <span class="number">100</span>,

- <span class="number"></span>,

- WindowManager.LayoutParams.TYPE_APPLICATION,

- WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE

- | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,

- PixelFormat.TRANSLUCENT);

- <span class="comment">// WindowManager windowManager = (WindowManager)</span>

- <span class="comment">// this.getSystemService(Context.WINDOW_SERVICE);</span>

- windowManager.addView(overlay, lp);

- }

- 
- <span class="keyword">private</span> <span class="keyword">class</span> LetterListViewListener <span class="keyword">implements</span>

- OnTouchingLetterChangedListener

- {

- 
- <span class="annotation">@Override</span>

- <span class="keyword">public</span> <span class="keyword">void</span> onTouchingLetterChanged(<span class="keyword">final</span> String s, <span class="keyword">float</span> y, <span class="keyword">float</span> x)

- {

- <span class="keyword">if</span> (alphaIndexer.get(s) != <span class="keyword">null</span>)

- {

- <span class="keyword">int</span> position = alphaIndexer.get(s);

- 
- listview.setSelection(position);

- overlay.setText(sections[position]);

- overlay.setVisibility(View.VISIBLE);

- 
- }

- }

- 
- <span class="annotation">@Override</span>

- <span class="keyword">public</span> <span class="keyword">void</span> onTouchingLetterEnd()

- {

- overlay.setVisibility(View.GONE);

- }

- }

- 
- <span class="keyword">private</span> <span class="keyword">class</span> OverlayThread <span class="keyword">implements</span> Runnable

- {

- 
- <span class="annotation">@Override</span>

- <span class="keyword">public</span> <span class="keyword">void</span> run()

- {

- overlay.setVisibility(View.GONE);

- }

- }

- 
- <span class="keyword">private</span> String getAlpha(String str)

- {

- <span class="keyword">if</span> (str == <span class="keyword">null</span>)

- {

- <span class="keyword">return</span> <span class="string">&#8220;#&#8221;</span>;

- }

- 
- <span class="keyword">if</span> (str.trim().length() == <span class="number"></span>)

- {

- <span class="keyword">return</span> <span class="string">&#8220;#&#8221;</span>;

- }

- 
- <span class="keyword">char</span> c = str.trim().substring(<span class="number"></span>, <span class="number">1</span>).charAt(<span class="number"></span>);

- 
- Pattern pattern = Pattern.compile(<span class="string">&#8220;^[A-Za-z]+$&#8221;</span>);

- <span class="keyword">if</span> (pattern.matcher(c + <span class="string">&#8220;&#8221;</span>).matches())

- {

- <span class="keyword">return</span> (c + <span class="string">&#8220;&#8221;</span>).toUpperCase();

- }

- <span class="keyword">else</span>

- {

- <span class="keyword">return</span> <span class="string">&#8220;#&#8221;</span>;

- }

- }

- 
- <span class="annotation">@Override</span>

- <span class="keyword">protected</span> <span class="keyword">void</span> onDestroy()

- {

- <span class="keyword">if</span> (windowManager != <span class="keyword">null</span>)<span class="comment">// 防止内存泄露</span>

- {

- windowManager.removeView(overlay);

- windowManager.removeView(suspend_search);

- }

- <span class="keyword">super</span>.onDestroy();

- }

- 
- }

MyLetterListView.java

**[java]** [view plain](http://blog.csdn.net/csh159/article/details/8955029#)[copy](http://blog.csdn.net/csh159/article/details/8955029#)[print](http://blog.csdn.net/csh159/article/details/8955029#)[?](http://blog.csdn.net/csh159/article/details/8955029#)
  <div>
    <embed id="ZeroClipboardMovie_7" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="29" height="15" align="middle" name="ZeroClipboardMovie_7">
    </embed>
  </div>
</div>
- <span class="keyword">package</span> com.example.menu;

- 
- <span class="keyword">import</span> android.content.Context;

- <span class="keyword">import</span> android.graphics.Canvas;

- <span class="keyword">import</span> android.graphics.Color;

- <span class="keyword">import</span> android.graphics.Paint;

- <span class="keyword">import</span> android.graphics.Typeface;

- <span class="keyword">import</span> android.util.AttributeSet;

- <span class="keyword">import</span> android.view.MotionEvent;

- <span class="keyword">import</span> android.view.View;

- 
- <span class="keyword">public</span> <span class="keyword">class</span> MyLetterListView <span class="keyword">extends</span> View

- {

- 
- <span class="keyword">private</span> OnTouchingLetterChangedListener onTouchingLetterChangedListener;

- 
- <span class="keyword">private</span> String[] b = { <span class="string">&#8220;@&#8221;</span>, <span class="string">&#8220;A&#8221;</span>, <span class="string">&#8220;B&#8221;</span>, <span class="string">&#8220;C&#8221;</span>, <span class="string">&#8220;D&#8221;</span>, <span class="string">&#8220;E&#8221;</span>, <span class="string">&#8220;F&#8221;</span>, <span class="string">&#8220;G&#8221;</span>, <span class="string">&#8220;H&#8221;</span>, <span class="string">&#8220;I&#8221;</span>, <span class="string">&#8220;J&#8221;</span>, <span class="string">&#8220;K&#8221;</span>,

- <span class="string">&#8220;L&#8221;</span>, <span class="string">&#8220;M&#8221;</span>, <span class="string">&#8220;N&#8221;</span>, <span class="string">&#8220;O&#8221;</span>, <span class="string">&#8220;P&#8221;</span>, <span class="string">&#8220;Q&#8221;</span>, <span class="string">&#8220;R&#8221;</span>, <span class="string">&#8220;S&#8221;</span>, <span class="string">&#8220;T&#8221;</span>, <span class="string">&#8220;U&#8221;</span>, <span class="string">&#8220;V&#8221;</span>, <span class="string">&#8220;W&#8221;</span>, <span class="string">&#8220;X&#8221;</span>,

- <span class="string">&#8220;Y&#8221;</span>, <span class="string">&#8220;Z&#8221;</span>, <span class="string">&#8220;#&#8221;</span> };

- 
- <span class="keyword">int</span> choose = &#8211;<span class="number">1</span>;

- 
- <span class="keyword">private</span> Paint paint = <span class="keyword">new</span> Paint();

- 
- <span class="keyword">boolean</span> showBkg = <span class="keyword">false</span>;

- 
- <span class="keyword">public</span> MyLetterListView(Context context, AttributeSet attrs, <span class="keyword">int</span> defStyle)

- {

- <span class="keyword">super</span>(context, attrs, defStyle);

- 
- }

- 
- <span class="keyword">public</span> MyLetterListView(Context context, AttributeSet attrs)

- {

- <span class="keyword">super</span>(context, attrs);

- 
- }

- 
- <span class="keyword">public</span> MyLetterListView(Context context)

- {

- <span class="keyword">super</span>(context);

- }

- 
- <span class="keyword">protected</span> <span class="keyword">void</span> onDraw(Canvas canvas)

- {

- <span class="keyword">super</span>.onDraw(canvas);

- <span class="keyword">if</span> (showBkg)

- {

- canvas.drawColor(Color.parseColor(<span class="string">&#8220;#40000000&#8221;</span>));

- }

- 
- <span class="keyword">int</span> height = getHeight();

- <span class="keyword">int</span> width = getWidth();

- <span class="keyword">int</span> singleHeight = height / b.length;

- <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number"></span>; i < b.length; i++)

- {

- paint.setTextSize(18f);

- paint.setColor(Color.BLACK);

- paint.setTypeface(Typeface.DEFAULT_BOLD);

- paint.setAntiAlias(<span class="keyword">true</span>);

- <span class="keyword">if</span> (i == choose)

- {

- paint.setColor(Color.parseColor(<span class="string">&#8220;#3399ff&#8221;</span>));

- paint.setFakeBoldText(<span class="keyword">true</span>);

- }

- <span class="keyword">float</span> xPos = width / <span class="number">2</span> &#8211; paint.measureText(b[i]) / <span class="number">2</span>;

- <span class="keyword">float</span> yPos = singleHeight * i + singleHeight;

- 
- canvas.drawText(b[i], xPos, yPos, paint);

- 
- paint.reset();

- }

- 
- }

- 
- <span class="annotation">@Override</span>

- <span class="keyword">public</span> <span class="keyword">boolean</span> dispatchTouchEvent(MotionEvent event)

- {

- <span class="keyword">final</span> <span class="keyword">int</span> action = event.getAction();

- <span class="keyword">final</span> <span class="keyword">float</span> y = event.getY();

- <span class="keyword">final</span> <span class="keyword">float</span> x = event.getX();

- <span class="keyword">final</span> <span class="keyword">int</span> oldChoose = choose;

- <span class="keyword">final</span> OnTouchingLetterChangedListener listener =

- onTouchingLetterChangedListener;

- <span class="keyword">final</span> <span class="keyword">int</span> c = (<span class="keyword">int</span>) (y / getHeight() * b.length);

- 
- <span class="keyword">switch</span> (action)

- {

- <span class="keyword">case</span> MotionEvent.ACTION_DOWN:

- showBkg = <span class="keyword">true</span>;

- <span class="keyword">if</span> (oldChoose != c && listener != <span class="keyword">null</span>)

- {

- <span class="keyword">if</span> (c > <span class="number"></span> && c < b.length)

- {

- listener.onTouchingLetterChanged(b[c], y, x);

- choose = c;

- invalidate();

- }

- }

- 
- <span class="keyword">break</span>;

- <span class="keyword">case</span> MotionEvent.ACTION_MOVE:

- <span class="keyword">if</span> (oldChoose != c && listener != <span class="keyword">null</span>)

- {

- <span class="keyword">if</span> (c > <span class="number"></span> && c < b.length)

- {

- listener.onTouchingLetterChanged(b[c], y, x);

- choose = c;

- invalidate();

- }

- }

- <span class="keyword">break</span>;

- <span class="keyword">case</span> MotionEvent.ACTION_UP:

- showBkg = <span class="keyword">false</span>;

- choose = &#8211;<span class="number">1</span>;

- listener.onTouchingLetterEnd();

- invalidate();

- <span class="keyword">break</span>;

- }

- <span class="keyword">return</span> <span class="keyword">true</span>;

- }

- 
- <span class="annotation">@Override</span>

- <span class="keyword">public</span> <span class="keyword">boolean</span> onTouchEvent(MotionEvent event)

- {

- <span class="keyword">return</span> <span class="keyword">super</span>.onTouchEvent(event);

- }

- 
- <span class="keyword">public</span> <span class="keyword">void</span> setOnTouchingLetterChangedListener(

- OnTouchingLetterChangedListener onTouchingLetterChangedListener)

- {

- <span class="keyword">this</span>.onTouchingLetterChangedListener = onTouchingLetterChangedListener;

- }

- 
- <span class="keyword">public</span> <span class="keyword">interface</span> OnTouchingLetterChangedListener

- {

- 
- <span class="keyword">public</span> <span class="keyword">void</span> onTouchingLetterEnd();

- 
- <span class="keyword">public</span> <span class="keyword">void</span> onTouchingLetterChanged(String s, <span class="keyword">float</span> y, <span class="keyword">float</span> x);

- }

- }

别忘了加权限:

**[html]** [view plain](http://blog.csdn.net/csh159/article/details/8955029#)[copy](http://blog.csdn.net/csh159/article/details/8955029#)[print](http://blog.csdn.net/csh159/article/details/8955029#)[?](http://blog.csdn.net/csh159/article/details/8955029#)
  <div>
    <embed id="ZeroClipboardMovie_8" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="29" height="15" align="middle" name="ZeroClipboardMovie_8">
    </embed>
  </div>
</div>
- <span class="tag"><</span><span class="tag-name">uses-permission</span> <span class="attribute">android:name</span>=<span class="attribute-value">&#8220;android.permission.READ_CONTACTS&#8221;</span> <span class="tag">/></span>

效果图:

转自:http://blog.csdn.net/csh159/article/details/8955029

💬 评论