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

相关文章
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
259 76
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
83 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
217 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
72 4
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
174 12
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
escrcpy 是一款基于 Scrcpy 的开源项目,使用 Electron 构建,提供图形化界面来显示和控制 Android 设备。它支持 USB 和 Wi-Fi 连接,帧率可达 30-120fps,延迟低至 35-70ms,启动迅速且画质清晰。escrcpy 拥有丰富的功能,包括自动化任务、多设备管理、反向网络共享、批量操作等,无需注册账号或广告干扰。适用于游戏直播、办公协作和教育演示等多种场景,是一款轻量级、高性能的 Android 控制工具。
116 1
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
72 1
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
Android开发的技术与开发流程
Android开发的技术与开发流程
463 1
安卓与iOS开发:平台差异与技术选择
【8月更文挑战第26天】 在移动应用开发的广阔天地中,安卓和iOS两大平台各占一方。本文旨在探索这两个系统在开发过程中的不同之处,并分析开发者如何根据项目需求选择合适的技术栈。通过深入浅出的对比,我们将揭示各自平台的优势与挑战,帮助开发者做出更明智的决策。
129 5
安卓与iOS开发:一场跨平台的技术角逐
在移动开发的广阔舞台上,两大主角——安卓和iOS,持续上演着激烈的技术角逐。本文将深入浅出地探讨这两个平台的开发环境、工具和未来趋势,旨在为开发者揭示跨平台开发的秘密,同时激发读者对技术进步的思考和对未来的期待。

热门文章

最新文章