android开发实例02:列表字母索引与过滤检索

简介:
在android开发中经常用到列表字母索引与过滤检索,特别是一些基于LBS的应用;
大众点评,点行,酒店达人等中,你都是看到列表字母索引与过滤检索的影子。下面把主要实现类贴出来~~,为了方便大家,源码已经打包并调试过,稍微修改下就可以在项目中使用!代码中有什么我写的不明的地方,给我留言。
瀛楁瘝绱㈠紩 妫¬绱㈣繃婊�
package com.Johnson.index;

import java.util.ArrayList;
import android.app.Activity;
import android.content.Context;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.os.Handler;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

/**
*   
* 城市选择 activity
*   
* @author Johnson
*   
*/

public class CitySelectActivity extends Activity implements
    ListView.OnScrollListener {

  // 城市选择

  private ListView listView;
  private ArrayList<City> listBasicData = new ArrayList<City>(); // 存放原始数据;
  private ArrayList<City> list = new ArrayList<City>(); // 存放临时数据
  private LayoutInflater mInflater;
  private RemoveWindow mRemoveWindow = new RemoveWindow();
  private WindowManager mWindowManager;
  private TextView mDialogText;
  private boolean mShowing;
  private boolean mReady;
  private String mPrevLetter = "";
  private EditText filterEdit;
  Handler mHandler = new Handler();

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    
                //原始数据
    listBasicData = City.getCityList();
    
    //初始化显示数据加入字幕索引item
    initShowData();
    this.setContentView(R.layout.city_select);
    mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    listView = (ListView) findViewById(R.id.list_view);
    final myAdapter adapter = new myAdapter();
    listView.setAdapter(adapter);
    listView.setItemsCanFocus( false);
    listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); // 设置单选模型
    listView.setOnItemClickListener( new AdapterView.OnItemClickListener() {
      @Override
      public void onItemClick(AdapterView<?> parent, View view,
          int position, long id) {
        
      Toast.makeText(getApplicationContext(), list.get(position).getCityName(), Toast.LENGTH_SHORT).show();
        
      }
    });

    filterEdit = (EditText) findViewById(R.id.edit_filter);
    filterEdit.addTextChangedListener( new TextWatcher() {
      public void onTextChanged(CharSequence s, int start, int before,
          int count) {
      }

      public void beforeTextChanged(CharSequence s, int start, int count,
          int after) {
      }

      public void afterTextChanged(Editable s) {
   
        final String txt = s.toString().toLowerCase();
        if (list != null) {
          list.clear();

          if (listBasicData != null && listBasicData.size() > 0) {
            for (City mCity : listBasicData) {

              String pinyin = mCity.getCityPinyin();
              String name = mCity.getCityName();
              if (pinyin.startsWith(txt)
                  || pinyin.startsWith(txt.toLowerCase())
                  || pinyin.startsWith(txt.toUpperCase())
                  || (name.indexOf(txt) != -1)) {
                list.add(mCity);
              }
            }
            if ("".equals(txt)) {
              //当字母过滤框内容为空重新初始化数据
              initShowData();
            }

            if ("".equals(txt)) {

              mReady = true;
            } else {
           
              mReady = false;
            }

            // List数据变化时, 刷新Dialog
            // dialog.notifyDataSetChanged();
            adapter.notifyDataSetChanged();
          }
        }
      }
    });

    initIndexTextView();
  }



  @Override
  public void onScroll(AbsListView view, int firstVisibleItem,
      int visibleItemCount, int totalItemCount) {
    int visibleItemIndex = firstVisibleItem;
    
    
    
    // int visibleItemIndex = firstVisibleItem + (visibleItemCount / 2 - 1);
    
    
    if (mReady) {

      City city = (City) list.get(visibleItemIndex);

      String firstLetter = city.getCityPinyin();
      System.out.println( "@" + firstLetter);

      if (firstLetter.equals( "-")) {
        firstLetter = firstLetter.substring(1, 2);
      } else {
        firstLetter = firstLetter.substring(0, 1);
      }

      if (!mShowing && firstLetter.equals(mPrevLetter)) {

        mShowing = true;
        mDialogText.setVisibility(View.VISIBLE);
      }

      mDialogText.setTextSize(40);
      mDialogText.setText(firstLetter);
      mHandler.removeCallbacks(mRemoveWindow);
      mHandler.postDelayed(mRemoveWindow, 1000);
      mPrevLetter = firstLetter;
    }
  }

  @Override
  public void onScrollStateChanged(AbsListView arg0, int arg1) {
    // TODO Auto-generated method stub

  }

  private void removeWindow() {

    if (mShowing) {
      mShowing = false;
      mDialogText.setVisibility(View.INVISIBLE);
    }
  }

  private final class RemoveWindow implements Runnable {
    public void run() {
      removeWindow();
    }
  }

  @Override
  protected void onResume() {
    super.onResume();
    mReady = true;
  }

  @Override
  protected void onPause() {
    super.onPause();
    removeWindow();
    mReady = false;
  }

  @Override
  protected void onDestroy() {
    super.onDestroy();
    if (mWindowManager != null) {
      mWindowManager.removeView(mDialogText);
    }

    mReady = false;
  }

  class myAdapter extends BaseAdapter {

    View convertView;

    City city;

    @Override
    public boolean isEnabled( int position) {

      if (city != null) {
        return !city.getCityName().startsWith( "-");
      } else {
        return true;
      }

    }

    @Override
    public int getCount() {
      // TODO Auto-generated method stub
      return list.size();
    }

    @Override
    public Object getItem( int position) {
      // TODO Auto-generated method stub
      return list.get(position);
    }

    @Override
    public long getItemId( int position) {
      // TODO Auto-generated method stub
      return position;
    }

    @Override
    public View getView( int position, View convertVie, ViewGroup arg2) {
      // TODO Auto-generated method stub
      convertView = convertVie;
      TextView tv;

      city = (City) list.get(position);

      if (city.getCityName().startsWith( "-")) {

        convertView = mInflater.inflate(
            R.layout.city_list_item_city_index, null);
        tv = (TextView) convertView
            .findViewById(R.id.city_list_item_city_index);
        tv.setText(city.getCityName().substring(1,
            city.getCityName().length()));

      } else {

        convertView = mInflater.inflate(R.layout.city_list_item_city,
            null);
        tv = (TextView) convertView
            .findViewById(R.id.city_list_item_city);
        tv.setText(city.getCityName());
      }

      return convertView;
    }
  }

  /**
    * 初始化用于显示的数据
    *    
    * @author johnson
    *   
    * */

   
  public void initShowData() {

    list.clear();
    list = Utils.rebuildList(listBasicData);

  }
   
  /**
    * 初始化程序列表索引IndexTextView
    *   
    * @author johnson
    * */
   
   
   
  public void initIndexTextView() {
    mWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
    listView.setOnScrollListener( this);
    mDialogText = (TextView) mInflater
        .inflate(R.layout.list_position, null);
    mDialogText.setVisibility(View.INVISIBLE);
    mHandler.post( new Runnable() {

      public void run() {
        mReady = true;
        WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
            LayoutParams.WRAP_CONTENT,
            LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_APPLICATION_STARTING,
            WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
                | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            PixelFormat.TRANSLUCENT);

        mWindowManager.addView(mDialogText, lp);
      }
    });

  }

}

本文出自 “Johnson” 博客,请务必保留此出处http://johnson008.blog.51cto.com/4000361/729410

相关文章
|
8天前
|
存储 安全 Android开发
安卓应用开发:构建一个高效的用户登录系统
【5月更文挑战第3天】在移动应用开发中,用户登录系统的设计与实现是至关重要的一环。对于安卓平台而言,一个高效、安全且用户体验友好的登录系统能够显著提升应用的用户留存率和市场竞争力。本文将探讨在安卓平台上实现用户登录系统的最佳实践,包括对最新身份验证技术的应用、安全性考量以及性能优化策略。
|
1天前
|
Java Android开发
Android开发--Intent-filter属性详解
Android开发--Intent-filter属性详解
|
1天前
|
物联网 Java 开发工具
安卓应用开发:打造未来移动生活
【5月更文挑战第10天】 随着科技的飞速发展,智能手机已成为我们日常生活中不可或缺的一部分。作为智能手机市场的两大巨头,安卓和iOS分别占据了一定的市场份额。在这篇文章中,我们将重点关注安卓应用开发,探讨如何利用先进的技术和创新思维,为用户打造更加便捷、智能的移动生活。文章将涵盖安卓应用开发的基本概念、关键技术、以及未来发展趋势等方面的内容。
|
2天前
|
Android开发
Android应用实例(一)之---有道辞典VZ.0
Android应用实例(一)之---有道辞典VZ.0
|
3天前
|
Java API 开发工具
java与Android开发入门指南
java与Android开发入门指南
10 0
|
4天前
|
Android开发
Android修改默认system/bin/下可执行程序拥有者和权限,使用实例,只有root和系统app权限才能执行某个命令。
Android修改默认system/bin/下可执行程序拥有者和权限,使用实例,只有root和系统app权限才能执行某个命令。
11 0
|
4天前
|
Android开发 Kotlin
Kotlin开发Android之基础问题记录
Kotlin开发Android之基础问题记录
15 1
|
4天前
|
Java Android开发
Android开发@IntDef完美替代Enum
Android开发@IntDef完美替代Enum
13 0
|
5天前
|
Android开发 C++
Android P HAL层添加HIDL实例
Android P HAL层添加HIDL实例
10 0
|
5天前
|
Android开发
Android 盒子开发过程中遇到的问题及解决方法
Android 盒子开发过程中遇到的问题及解决方法
8 2