快速集成android实现listview的字母A-Z排序,界面侧边字母索引

 转载请标明出处

Android手机字母A-Z排序侧边索引是非常常见的功能,在此提供快速集成框架.教你用Android studio工具一分钟搞定这个效果.

实现效果:

以及点击F跳转效果

第一步库包导入实现拼音检索功能

-------拼音检索详细见:

compile ‘com.github.promeg:tinypinyin:1.0.0‘// ~80KB同步后后面会下载80k的文件,就可以使用

-------测试一下:

public void go1(View view){//按钮go1点击测试    String str="界面侧边ABc字母检索";   for (char c:str.toCharArray()){        System.out.println("检索返回:"+Pinyin.toPinyin(c));//如果c为汉字,则返回大写拼音;如果c不是汉字,则返回String.valueOf(c)        System.out.println("如果c为汉字,则返回true,否则返回false:"+Pinyin.isChinese(c));    }}
结果效果:
  
第二步构建代码:







1.适配器LvRithtItemAdapter类


public class LvRightItemAdapter extends BaseAdapter {

    private List<DataEntity> mEntities;

    private Activity context;
    private LayoutInflater layoutInflater;

    public LvRightItemAdapter(Activity context,List<DataEntity> entities) {
        this.context = context;
        this.mEntities = entities;
        this.layoutInflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        return mEntities.size();
    }

    @Override
    public DataEntity getItem(int position) {
        return mEntities.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = layoutInflater.inflate(R.layout.lv_right_item, parent,false);
            ViewHolder viewHolder = new ViewHolder();
            viewHolder.tvLvRightItem = (TextView) convertView.findViewById(R.id.tv_lv_right_item);

            convertView.setTag(viewHolder);
        }
        initializeViews((DataEntity)getItem(position), (ViewHolder) convertView.getTag());
        return convertView;
    }

    private void initializeViews(DataEntity entity, ViewHolder holder) {
        //TODO implement
        holder.tvLvRightItem.setText(String.valueOf(entity.getChar_First()));
    }

    protected class ViewHolder {
        private TextView tvLvRightItem;
    }
}

2.自定义MyExpandAdapter代码(这个类只是把没用到的ExpandableListAdapter复写方法存放在这):


public abstract class MyExpandAdapter implements ExpandableListAdapter{
    //用抽象方法把下拉子菜单的不用的方法集中在这里,方便观看
    //抽象出接口,回调方法,用方法继承就可以定义子菜单
    @Override
    public void registerDataSetObserver(DataSetObserver observer) {
    }
    @Override
    public void unregisterDataSetObserver(DataSetObserver observer) {

    }

    @Override
    public Object getGroup(int groupPosition) {
        return null;
    }
    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return null;
    }
    @Override
    public long getGroupId(int groupPosition) {
        return 0;
    }
    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return 0;
    }
    @Override
    public boolean hasStableIds() {
        return false;
    }
   @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return false;
    }
    @Override
    public boolean areAllItemsEnabled() {
        return false;
    }
    @Override
    public boolean isEmpty() {
        return false;
    }
    @Override
    public void onGroupExpanded(int groupPosition) {
    }
    @Override
    public void onGroupCollapsed(int groupPosition) {

    }
    @Override
    public long getCombinedChildId(long groupId, long childId) {
        return 0;
    }
    @Override
    public long getCombinedGroupId(long groupId) {
        return 0;
    }
}
3.精简的下拉子菜单自定义SimpleExpAdapter适配器类
public class SimpleExpAdapter extends MyExpandAdapter{
    private List<DataEntity> mDataEntities;   //列表数据存放的集合
    private Activity mActivity;
    private LayoutInflater mLayoutInflater;  //布局渲染成一个view

    public SimpleExpAdapter(List<DataEntity> dataEntities, Activity activity){
        mDataEntities = dataEntities;
        mActivity = activity;
        mLayoutInflater=mActivity.getLayoutInflater();
    }

    @Override
    public int getGroupCount() {
        return mDataEntities.size();
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        return mDataEntities.get(groupPosition).getDatas().size();
    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        ViewHolder viewHolder=null;
        if (convertView==null){
            viewHolder=new ViewHolder();
            convertView=mLayoutInflater.inflate(R.layout.exlv_item_group,parent,false);
            viewHolder.mTextView= (TextView) convertView.findViewById(R.id.tv_exlv_group);
            convertView.setTag(viewHolder);
        }else {
            viewHolder= (ViewHolder) convertView.getTag();
        }
        viewHolder.mTextView.setText(String.valueOf(mDataEntities.get(groupPosition).getChar_First()));//适配器设置列表数据
        return convertView;
    }

    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        ViewHolder viewHolder=null;
        if (convertView==null){
            viewHolder=new ViewHolder();
            convertView=mLayoutInflater.inflate(R.layout.exlv_item_child,parent,false);
            viewHolder.mTextView= (TextView) convertView.findViewById(R.id.tv_exlv_child);
            convertView.setTag(viewHolder);
        }else{
            viewHolder= (ViewHolder) convertView.getTag();
        }
        viewHolder.mTextView.setText(mDataEntities.get(groupPosition).getDatas().get(childPosition));
        return convertView;
    }
    class ViewHolder{//item放置的控件
        TextView mTextView;
    }
}

4.数据逻辑控制dao包:

public class DataDao {
    private List<DataEntity> mDataEntities=new ArrayList<>();
    public void add(String data){
        char data_first=data.toUpperCase().charAt(0);   //将首个字母转换为大写字母
        if (Pinyin.isChinese(data_first)){   //如果首个字母是中文,则获取汉字首个字母的大写
            data_first= Pinyin.toPinyin(data_first).charAt(0);
        }
        //确保取得大写的唯一首字母,然后继续执行
        for (DataEntity dataEntity:mDataEntities){
            if (dataEntity.isSameFirst(data_first)){
                dataEntity.addData(data);
                return;
            }
        }
        DataEntity dataEntity=new DataEntity();
        dataEntity.setChar_First(data_first);
        dataEntity.addData(data);
        mDataEntities.add(dataEntity);
        Collections.sort(mDataEntities);
   }
    public List<DataEntity> getDataEntities() {
        System.out.println(mDataEntities.toString());
        return mDataEntities;
    }
}

5.封装列表数据类:

public class DataEntity implements Comparable<DataEntity>{
    private char mChar_First;   //定义首字母
    private List<String> mDatas=new ArrayList<>();
   public  boolean isSameFirst(char des){//判断是否与传入的des相等
        return des==this.mChar_First;
    }
    public void addData(String data){
        mDatas.add(data);
        Collections.sort(mDatas);  //排列首字母相同的列表数据
        System.out.println(mDatas.toString());
    }
    @Override
    public int compareTo(DataEntity another) {
        return this.mChar_First-another.getChar_First();
    }
    public List<String> getDatas() {  //存放同首字母的列表数据
        return mDatas;
    }
   public char getChar_First() {
        return mChar_First;
    }
    public void setChar_First(char char_First) {
        mChar_First = char_First;
    }
   @Override
    public String toString() {
        return "DataEntity{" +
                "mChar_First=" + mChar_First +
                ", mDatas=" + mDatas +
                '}';
    }
}

6显示的activity界面类(数据直接在addlistdatas()方法中添加):

public class MainActivity extends AppCompatActivity {
    ExpandableListView mExlv;
    DataDao mDataDao=new DataDao();
    ListView mLvRight; //右侧的字母栏
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        addListdatas();//填充列表假数据测试,失败经验:数据不能再setadapter之后进行
        initListener();
   }
    public void initListener(){
        mExlv.setAdapter(new SimpleExpAdapter(mDataDao.getDataEntities(), this));
        //全都展开不能回缩
        for (int i = 0; i < mDataDao.getDataEntities().size(); i++) {
            mExlv.expandGroup(i);
        }
        mExlv.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
            @Override
            public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
                return true;
            }
        });
        mLvRight.setAdapter(new LvRightItemAdapter(this,mDataDao.getDataEntities()));
        mLvRight.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                mExlv.setSelectedGroup(position);

            }
        });
    }
    public void initView(){
        mExlv= (ExpandableListView) findViewById(R.id.exlv);
        mLvRight= (ListView) findViewById(R.id.lv_right);

    }
//    public void go1(View view){   //字母检索
//        String str="界面侧边ABc字母检索";
//        for (char c:str.toCharArray()){
//            System.out.println("检索返回:"+Pinyin.toPinyin(c));//如果c为汉字,则返回大写拼音;如果c不是汉字,则返回String.valueOf(c)
//            System.out.println("如果c为汉字,则返回true,否则返回false:"+Pinyin.isChinese(c));
//        }
//    }
    public void addListdatas(){
        mDataDao.add("拜拜这是b");
        mDataDao.add("啊啊这是a");
        mDataDao.add("啧啧这是z");
        mDataDao.add("烦烦这是f");
        mDataDao.add("哥哥这是g");
        mDataDao.add("哈哈这是h");
        mDataDao.add("看看这是k");
        mDataDao.add("啊拜这是ab");
        for(int i='a';i<'z';i++){
            if (i=='e'||i=='h'){
                continue;
            }
            mDataDao.add((char) i + "1");
            mDataDao.add((char) i + "2");
            mDataDao.add((char) i + "3");
        }
        for (int i = 'A'; i <= 'Z'; i++) {
            if (i == 'E' || i == 'H') {
                continue;
            }
            mDataDao.add((char) i + "1");
            mDataDao.add((char) i + "2");
            mDataDao.add((char) i + "3");
        }
   }
第三步xml界面的构建:

1.activity界面的实现:
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ui.MainActivity">

    <ExpandableListView
        android:id="@+id/exlv"
        android:groupIndicator="@null"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />
    <ListView
        android:id="@+id/lv_right"
        android:layout_width="20dp"
        android:divider="@null"
        android:layout_alignParentRight="true"
        android:layout_height="match_parent"></ListView>
</RelativeLayout>
2.exlv_item_child自定义适配器布局(可以根据自己想法更改界面显示)
<TextView android:id="@+id/tv_exlv_child"
          xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
          android:layout_height="50dp"
          android:background="#bbb"
          android:gravity="center_vertical"
          android:paddingLeft="15dp"
          android:textSize="12sp">
</TextView>

3.exlv_item_group自定义适配器布局(可以根据自己想法更改界面显示)

<TextView android:id="@+id/tv_exlv_group"
          xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
          android:layout_height="20dp"
          android:background="#fff"
          android:gravity="center_vertical"
          android:paddingLeft="15dp"
          android:textSize="12sp">
</TextView>

4.lv_right_item自定义listview适配器布局(可以根据自己想法更改界面显示)

<TextView
    android:id="@+id/tv_lv_right_item"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="20dp"
    android:background="#00ffffff"
    android:gravity="center"
    android:textSize="12sp">
</TextView>

最后原理总结:

-----原理解析

概括:字符串放入 集合 中进行排序

分层结构:

A:  a开头名字数据   子菜单名字(字符串排序:Collections.sort( 数据));

所有数据(如电话名字)     B:b开头名字数据 子菜单名字(字符串排序:Collections.sort( 数据));

C:  c开头数据数据 子菜单名字(字符串排序:Collections.sort( 数据));

.....

在ASll码表中字母大小写位置

-----------implement方法构建精简的下拉子菜单适配器.


注意:用抽象类的方法,让我们想要的适配器实现需要的复写的方法

--------列表数据形式:


时间: 2024-10-29 19:05:36

快速集成android实现listview的字母A-Z排序,界面侧边字母索引的相关文章

Android中ListView字母排序,实现字母挤压效果以及右侧快速选中字母,搜索关键字功能

Android中ListView字母排序,实现字母挤压效果以及右侧快速选中字母,搜索关键字功能 本文中阐述如何自定义EditText实现搜索框自定义的样式以及挤压字母的思路等 自定义EditText 相关的drawable文件 主界面以及相关的适配器 结果展示 定义要呈现的EditText的样式 public class ClearEditText extends EditText implements OnFocusChangeListener, TextWatcher { /** * 定义删

Android 实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音

转载请注明出处:http://blog.csdn.net/xiaanming/article/details/12684155 前段时间因为换工作的缘故又恰巧碰到国庆节,所以有段时间自己没有更新博客了,过完国庆到新公司报道,感觉还不错,就是现在住的地方离新公司有点远,地铁20站,伤不起啊,我每天早上7点多就要起床,然后屁颠屁颠的去挤地铁上班,晚上下班还要挤地铁,先不说路程远,车费一天就要10几块,我的银子啊,有坐龙华线去上班的深圳程序员不?听说那条线上班高峰期很挤?我没在上班高峰期坐过那趟车,我

用 jpush-react-native 插件快速集成推送功能(Android 篇)

概述 jpush-react-native 是极光推送官方开发的 React Native 版本插件,可以快速集成推送功能.现在最新版本的 JPush SDK 分离了 JPush 及 JCore,让开发者可以分开集成 JMessage 及 JPush(以前 JMessage 包含了 JPush).下面就来具体说一下如何快速集成以及使用 jpush-react-native 插件. 安装 打开终端,进入项目文件夹,执行以下命令: npm install jcore-react-native --s

ShareSDK入门指南:Android 10分钟快速集成

ShareSDK 官方已提供Android 快速集成教程,以官方教程为参考,本文重点指导大家在集成中遇到的问题. Android 快速集成官方教程:http://wiki.mob.com/Android_快速集成指南/ 1.注册ShareSDK的官方开发者账号,获取AppKey,只有获取了AppKey才可以调用ShareSDK的API: 2.设置下载SDK,在这里勾选你需要分享到的平台,不勾选的平台不会下载下来: 3.点击“下载SDK”下载自定义的SDK压缩包: 4.解压刚才下载的SDK文件,打

Android Studio快速集成讯飞SDK实现文字朗读功能

今天,我们来学习一下怎么在Android Studio快速集成讯飞SDK实现文字朗读功能,先看一下效果图: 第一步 :了解TTS语音服务 TTS的全称为Text To Speech,即“从文本到语音”.它是同时运用语言学和心理学的杰出之作,在内置芯片的支持之下,通过神经网络的设计,把文字智能地转化为自然语音流. TTS技术对文本文件进行实时转换,转换时间之短可以秒计算.在其特有智能语音控制器作用下,文本输出的语音音律流畅,使得听者在听取信息时感觉自然,毫无机器语音输出的冷漠与生涩感.使用户可以听

android之ListView分组及字母索引导航(2)重构-接口

上篇文章对listView 分组和字母索引导航的实现思路做了分析,并依照思路一步步实现,到最后已经较好的实现了全部功能.但是仔细研究就会发现其实现不够好,主要问题: 1.               对于一个使用范围比较广泛的布局,以上实现不够通用,尤其是Bo中需加上一些多余的字段,这些字字段本身并没有意义. 2.               代码都糅合在activity中. 针对以上两点做一些代码重构.首先我们把其优化为一个通用的activity.这样做成通用的View就很容易:然后对代码进行

android的ListView

strings.xml <?xml version="1.0" encoding="utf-8"?> <resources>     <string name="app_name">ListView</string>     <string name="hello_world">Hello world!</string>     <string na

Android自定义控件——ListView的下拉刷新与上拉加载

转载请注明出处:http://blog.csdn.net/allen315410/article/details/39965327 1.简介 无疑,在Android开发中,ListView是使用非常频繁的控件之一,ListView提供一个列表的容易,允许我们以列表的形式将数据展示到界面上,但是Google给我们提供的原生ListView的控件,虽然在功能上很强大,但是在用户体验和动态效果上,还是比较差劲的.为了改善用户体验,市面上纷纷出现了各种各样的自定义的ListView,他们功能强大,界面美

Android使用ListView应该注意的地方

在ListView中设置Selector为null会报空指针? mListView.setSelector(null);//空指针 试试下面这种: mListView.setSelector(new ColorDrawable(Color.TRANSPARENT)); 如何让ListView初始化的时候就选中一项? ListView需要在初始化好数据后,其中一项需要呈选中状态.所谓"选中状态"就是该项底色与其它项不同,setSelection(position)只能定位到某个item,