like another way for me, here ado, directly on the code and pictures.
renderings are as follows:
Step: MainActivity code is as follows:
- package net.loonggg.test;
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.HashMap;
- import java.util.List;
- import java.util.TreeSet;
- import android.os.Bundle;
- import android.app.Activity;
- import android.graphics.Color;
- import android.view.MotionEvent;
- import android.view.View;
- import android.view.View.OnTouchListener;
- import android.view.Window;
- import android.widget.LinearLayout;
- import android.widget.ListView;
- import android.widget.TextView;
- import android.widget.LinearLayout.LayoutParams; < / li>
- public class ; MainActivity extends Activity {
- private HashMap
selector; / / store index letter containing the location - private LinearLayout layoutIndex; < / span>
- private ListView listView;
- private TextView tv_show; < / span>
- private ListViewAdapter adapter;
- private String [] indexStr = { "#" , "A" , "B" , "C" < span>, "D" , "E" , "F" , "G" < / span> , "H" ,
- "I" , "J" , "K" , "L" , "M" , "N" , "O" , "P" , "Q" , "R" , " S " , " T " , "U" ,
- "V" , "W" , "X" < / span> , "Y" , "Z" ; };
- private List
persons = null ; - private List
newPersons = new ArrayList (); - private int < span> height; / / font height
- private boolean flag = false ;
- @ Override
- protected void < span> onCreate (Bundle savedInstanceState) {
- super . onCreate (savedInstanceState); ;
- / / go to the title bar
- requestWindowFeature (Window.FEATURE_NO_TITLE);
- setContentView (R.layout.activity_main);
- layoutIndex = (LinearLayout) this . findViewById (R.id.layout);
- layoutIndex.setBackgroundColor (Color.parseColor ( "# 00ffffff" ));
- listView = (ListView) findViewById (R.id.listView);
- tv_show = (TextView) findViewById (R.id.tv); < / li>
- tv_show.setVisibility (View.GONE);
- setData ();
- String [] allNames = sortIndex (persons);
- sortList (allNames);
- selector = new HashMap
(); - for ( int j = 0 ; j < indexStr.length; j + +) { / / loop alphabet letters identify newPersons corresponding position
- for (< / span> int i = 0 ; i ;
- if (newPersons.get (i). getName (). equals (indexStr [j])) {
- selector.put ( indexStr [j], i);
- }
- }
- }
- adapter = new ListViewAdapter ( this , newPersons);
- listView.setAdapter (adapter);
- }
- / **
- * reordered get a new List collection
- *
- * @ param allNames
- * /
- private void < span> sortList (String [] allNames) {
- for ( int i = 0 ; i < allNames.length; i + +) {
- if (allNames [i]. length ()! = 1 ) { < / li>
- for ( int j = 0 ; j
- if (allNames [i]. equals (persons.get (j). getPinYinName ())) { < / li>
- ; Person p = new Person (persons.get (j). getName (), persons ;
- . get (j). getPinYinName ());
- ; newPersons.add (p);
- } ;
- }
- } else ; {
- newPersons.add ( new Person (allNames [i]));
- }
- }
- }
- @ Override
- public void onWindowFocusChanged ( boolean hasFocus) {
- / / in oncreate execute the following code inside did not respond, because oncreate get inside getHeight = 0
- if (! flag) ; { / / why we want to set a flag to mark, I am here to tell you is not first, the reader study, because it is good for your future development
- height = layoutIndex.getMeasuredHeight () / indexStr.length; ;
- getIndexView ();
- flag = true ;
- }
- }
- / **
- * obtain new data after sorting
- *
- * @ param persons
- * @ return
- * /
- public String [] sortIndex (List
persons) { - TreeSet
set = new TreeSet (); - / / initialize the data source for the first letter, added to the set
- for (Person person : persons) {
- set.add (StringHelper.getPinYinHeadChar (person.getName ()). substring ( ;
- ; 0 , 1 ));
- }
- / / new length of the array is set to the original data plus Size
- String [] names = new String [persons.size () + set.size ()];
- int i = 0 ;
- for (String string: set) {
- names [i] = string;
- i + +;
- }
- String [] pinYinNames = new String [persons.size ()];
- for ( int j = 0 ; j < persons.size (); j + +) {
- persons.get (j). setPinYinName (
- ; StringHelper
- . getPingYin (persons.get (j). getName (). toString ()));
- pinYinNames [j] = StringHelper.getPingYin (persons. get (j). getName ()
- . toString () );
- }
- / / original data is copied to the new data <span> ;
- System.arraycopy (pinYinNames, 0 , names, set.size (), pinYinNames.length);
- / / automatically in alphabetical order
- Arrays.sort (names, String.CASE_INSENSITIVE_ORDER);
- return names;
- }
- / **
- * rendering index list
- * /
- public void < span> getIndexView () {
- LinearLayout.LayoutParams params = new < span> LayoutParams (
- LayoutParams.WRAP_CONTENT, height); ;
- for ( int i = 0 ; i < indexStr.length; i + +) {
- final TextView tv = new TextView ( this ) ;
- tv.setLayoutParams (params);
- tv.setText (indexStr [i]);
- tv.setPadding ( 10 , 0 , 10 , 0 );
- layoutIndex.addView (tv);
- layoutIndex.setOnTouchListener ( new OnTouchListener () {
- @ Override
- public boolean onTouch (View v, MotionEvent event)
- {
- ; float y = event.getY ();
- int index = ( int ) (y / height );
- ; if (index> - 1 & ; & index
/ / prevent transboundary - String key = indexStr [index];
- ; if (selector.containsKey (key)) {
- int pos = selector.get (key);
- ; if (listView.getHeaderViewsCount ()> 0 ) { / / prevent ListView has a title bar, in this case no.
- listView.setSelectionFromTop (
- ; pos + listView.getHeaderViewsCount ( ), 0 );
- } else {
- ; listView.setSelectionFromTop (pos, 0 ) ; / / slide to the first item
- }
- ; tv_show.setVisibility (View.VISIBLE);
- tv_show.setText (indexStr [index]);
- ;}
- } ;
- ; switch (event.getAction ()) {
- case MotionEvent.ACTION_DOWN:
- ; layoutIndex.setBackgroundColor (Color
- . parseColor ( "# 606060" ));
- ; break ;
- ; case MotionEvent.ACTION_MOVE:
- ; break ;
- case MotionEvent.ACTION_UP:
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
没有评论:
发表评论