我们在进行Android开发时经常会用到列表字母索引和过滤检索,尤其是基于LBS的一些应用。在酒店达人、大众点评等应用中都能看到列表字母索引和过滤检索的使用。为了帮助大家开发,本文把列表字母索引和过滤检索的实例代码贴出来供大家参考,在实际使用时只需稍加修改即可。下面直接上代码。

Java代码
  1. package com.Johnson.index;    
  2.   
  3. import java.util.ArrayList;    
  4. import android.app.Activity;    
  5. import android.content.Context;    
  6. import android.graphics.PixelFormat;    
  7. import android.os.Bundle;    
  8. import android.os.Handler;    
  9. import android.text.Editable;    
  10. import android.text.TextWatcher;    
  11. import android.view.LayoutInflater;    
  12. import android.view.View;    
  13. import android.view.ViewGroup;    
  14. import android.view.WindowManager;    
  15. import android.view.WindowManager.LayoutParams;    
  16. import android.widget.AbsListView;    
  17. import android.widget.AdapterView;    
  18. import android.widget.BaseAdapter;    
  19. import android.widget.EditText;    
  20. import android.widget.ListView;    
  21. import android.widget.TextView;    
  22. import android.widget.Toast;    
  23.   
  24. /**   
  25. *      
  26. * 城市选择 activity   
  27. *      
  28. * @author Johnson   
  29. *      
  30. */    
  31. public class CitySelectActivity extends Activity implements    
  32.     ListView.OnScrollListener {    
  33.   
  34.   // 城市选择    
  35.   
  36.   private ListView listView;    
  37.   private ArrayList<City> listBasicData = new ArrayList<City>();// 存放原始数据;    
  38.   private ArrayList<City> list = new ArrayList<City>();// 存放临时数据    
  39.   private LayoutInflater mInflater;    
  40.   private RemoveWindow mRemoveWindow = new RemoveWindow();    
  41.   private WindowManager mWindowManager;    
  42.   private TextView mDialogText;    
  43.   private boolean mShowing;    
  44.   private boolean mReady;    
  45.   private String mPrevLetter = "";    
  46.   private EditText filterEdit;    
  47.   Handler mHandler = new Handler();    
  48.   
  49.   @Override    
  50.   protected void onCreate(Bundle savedInstanceState) {    
  51.     super.onCreate(savedInstanceState);    
  52.         
  53.                 //原始数据    
  54.     listBasicData = City.getCityList();    
  55.         
  56.     //初始化显示数据加入字幕索引item    
  57.     initShowData();    
  58.     this.setContentView(R.layout.city_select);    
  59.     mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);    
  60.     listView = (ListView) findViewById(R.id.list_view);    
  61.     final myAdapter adapter = new myAdapter();    
  62.     listView.setAdapter(adapter);    
  63.     listView.setItemsCanFocus(false);    
  64.     listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);// 设置单选模型    
  65.     listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {    
  66.       @Override    
  67.       public void onItemClick(AdapterView<?> parent, View view,    
  68.           int position, long id) {    
  69.             
  70.       Toast.makeText(getApplicationContext(), list.get(position).getCityName(), Toast.LENGTH_SHORT).show();    
  71.             
  72.       }    
  73.     });    
  74.   
  75.     filterEdit = (EditText) findViewById(R.id.edit_filter);    
  76.     filterEdit.addTextChangedListener(new TextWatcher() {    
  77.       public void onTextChanged(CharSequence s, int start, int before,    
  78.           int count) {    
  79.       }    
  80.   
  81.       public void beforeTextChanged(CharSequence s, int start, int count,    
  82.           int after) {    
  83.       }    
  84.   
  85.       public void afterTextChanged(Editable s) {    
  86.        
  87.         final String txt = s.toString().toLowerCase();    
  88.         if (list != null) {    
  89.           list.clear();    
  90.   
  91.           if (listBasicData != null && listBasicData.size() > 0) {    
  92.             for (City mCity : listBasicData) {    
  93.   
  94.               String pinyin = mCity.getCityPinyin();    
  95.               String name = mCity.getCityName();    
  96.               if (pinyin.startsWith(txt)    
  97.                   || pinyin.startsWith(txt.toLowerCase())    
  98.                   || pinyin.startsWith(txt.toUpperCase())    
  99.                   || (name.indexOf(txt) != -1)) {    
  100.                 list.add(mCity);    
  101.               }    
  102.             }    
  103.             if ("".equals(txt)) {    
  104.               //当字母过滤框内容为空重新初始化数据    
  105.               initShowData();    
  106.             }    
  107.   
  108.             if ("".equals(txt)) {    
  109.   
  110.               mReady = true;    
  111.             } else {    
  112.                
  113.               mReady = false;    
  114.             }    
  115.   
  116.             // List数据变化时, 刷新Dialog    
  117.             // dialog.notifyDataSetChanged();    
  118.             adapter.notifyDataSetChanged();    
  119.           }    
  120.         }    
  121.       }    
  122.     });    
  123.   
  124.     initIndexTextView();    
  125.   }    
  126.   
  127.   
  128.   
  129.   @Override    
  130.   public void onScroll(AbsListView view, int firstVisibleItem,    
  131.       int visibleItemCount, int totalItemCount) {    
  132.     int visibleItemIndex = firstVisibleItem;    
  133.         
  134.         
  135.         
  136.     // int visibleItemIndex = firstVisibleItem + (visibleItemCount / 2 - 1);    
  137.         
  138.         
  139.     if (mReady) {    
  140.   
  141.       City city = (City) list.get(visibleItemIndex);    
  142.   
  143.       String firstLetter = city.getCityPinyin();    
  144.       System.out.println("@" + firstLetter);    
  145.   
  146.       if (firstLetter.equals("-")) {    
  147.         firstLetter = firstLetter.substring(12);    
  148.       } else {    
  149.         firstLetter = firstLetter.substring(01);    
  150.       }    
  151.   
  152.       if (!mShowing && firstLetter.equals(mPrevLetter)) {    
  153.   
  154.         mShowing = true;    
  155.         mDialogText.setVisibility(View.VISIBLE);    
  156.       }    
  157.   
  158.       mDialogText.setTextSize(40);    
  159.       mDialogText.setText(firstLetter);    
  160.       mHandler.removeCallbacks(mRemoveWindow);    
  161.       mHandler.postDelayed(mRemoveWindow, 1000);    
  162.       mPrevLetter = firstLetter;    
  163.     }    
  164.   }    
  165.   
  166.   @Override    
  167.   public void onScrollStateChanged(AbsListView arg0, int arg1) {    
  168.     // TODO Auto-generated method stub    
  169.   
  170.   }    
  171.   
  172.   private void removeWindow() {    
  173.   
  174.     if (mShowing) {    
  175.       mShowing = false;    
  176.       mDialogText.setVisibility(View.INVISIBLE);    
  177.     }    
  178.   }    
  179.   
  180.   private final class RemoveWindow implements Runnable {    
  181.     public void run() {    
  182.       removeWindow();    
  183.     }    
  184.   }    
  185.   
  186.   @Override    
  187.   protected void onResume() {    
  188.     super.onResume();    
  189.     mReady = true;    
  190.   }    
  191.   
  192.   @Override    
  193.   protected void onPause() {    
  194.     super.onPause();    
  195.     removeWindow();    
  196.     mReady = false;    
  197.   }    
  198.   
  199.   @Override    
  200.   protected void onDestroy() {    
  201.     super.onDestroy();    
  202.     if (mWindowManager != null) {    
  203.       mWindowManager.removeView(mDialogText);    
  204.     }    
  205.   
  206.     mReady = false;    
  207.   }    
  208.   
  209.   class myAdapter extends BaseAdapter {    
  210.   
  211.     View convertView;    
  212.   
  213.     City city;    
  214.   
  215.     @Override    
  216.     public boolean isEnabled(int position) {    
  217.   
  218.       if (city != null) {    
  219.         return !city.getCityName().startsWith("-");    
  220.       } else {    
  221.         return true;    
  222.       }    
  223.   
  224.     }    
  225.   
  226.     @Override    
  227.     public int getCount() {    
  228.       // TODO Auto-generated method stub    
  229.       return list.size();    
  230.     }    
  231.   
  232.     @Override    
  233.     public Object getItem(int position) {    
  234.       // TODO Auto-generated method stub    
  235.       return list.get(position);    
  236.     }    
  237.   
  238.     @Override    
  239.     public long getItemId(int position) {    
  240.       // TODO Auto-generated method stub    
  241.       return position;    
  242.     }    
  243.   
  244.     @Override    
  245.     public View getView(int position, View convertVie, ViewGroup arg2) {    
  246.       // TODO Auto-generated method stub    
  247.       convertView = convertVie;    
  248.       TextView tv;    
  249.   
  250.       city = (City) list.get(position);    
  251.   
  252.       if (city.getCityName().startsWith("-")) {    
  253.   
  254.         convertView = mInflater.inflate(    
  255.             R.layout.city_list_item_city_index, null);    
  256.         tv = (TextView) convertView    
  257.             .findViewById(R.id.city_list_item_city_index);    
  258.         tv.setText(city.getCityName().substring(1,    
  259.             city.getCityName().length()));    
  260.   
  261.       } else {    
  262.   
  263.         convertView = mInflater.inflate(R.layout.city_list_item_city,    
  264.             null);    
  265.         tv = (TextView) convertView    
  266.             .findViewById(R.id.city_list_item_city);    
  267.         tv.setText(city.getCityName());    
  268.       }    
  269.   
  270.       return convertView;    
  271.     }    
  272.   }    
  273.   
  274.   /**   
  275.     * 初始化用于显示的数据   
  276.     *       
  277.     * @author johnson   
  278.     *      
  279.     * */    
  280.        
  281.   public void initShowData() {    
  282.   
  283.     list.clear();    
  284.     list = Utils.rebuildList(listBasicData);    
  285.   
  286.   }    
  287.        
  288.   /**   
  289.     * 初始化程序列表索引IndexTextView   
  290.     *      
  291.     * @author johnson   
  292.     * */       
  293.        
  294.   public void initIndexTextView() {    
  295.     mWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);    
  296.     listView.setOnScrollListener(this);    
  297.     mDialogText = (TextView) mInflater    
  298.         .inflate(R.layout.list_position, null);    
  299.     mDialogText.setVisibility(View.INVISIBLE);    
  300.     mHandler.post(new Runnable() {    
  301.   
  302.       public void run() {    
  303.         mReady = true;    
  304.         WindowManager.LayoutParams lp = new WindowManager.LayoutParams(    
  305.             LayoutParams.WRAP_CONTENT,    
  306.             LayoutParams.WRAP_CONTENT,    
  307.             WindowManager.LayoutParams.TYPE_APPLICATION_STARTING,    
  308.             WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE    
  309.                 | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,    
  310.             PixelFormat.TRANSLUCENT);    
  311.   
  312.         mWindowManager.addView(mDialogText, lp);    
  313.       }    
  314.     });    
  315.   
  316.   }    
  317.   
  318. }   

 

本文发布:Android开发网
本文地址:http://www.jizhuomi.com/android/example/50.html
2012年5月22日
发布:鸡啄米 分类:Android开发实例 浏览: 评论:0