澳门新浦京娱乐场网站-www.146.net-新浦京娱乐场官网
做最好的网站

澳门新浦京娱乐场网站:打造一个可以快速索引

在支付中有个须求是三个抉择城市的列表,看了看做成三级联动好像不是专程方便 照旧做成一整页得以按导航选用的就足以了

本文实例陈说了PHP实现获取第贰当中文首字母并拓宽排序的艺术。共享给我们供大家参考,具体如下:

相信绝大多数LBS的APP里面,大家都能看出二个带索引的城邑列表页面,用来让客商接受所在城市。

记得在自身刚开始接触到美团网的时候就对美团网这些城墙一定、接受城市作用很感兴趣,以为它做得很棒。有如下多少个点:
豆蔻梢头:完成ListView的A-Z字母排序效率
二:根据输入框的输入值更改来过滤搜索结果,借使输入框里面包车型大巴值为空,更新为本来的列表,不然为过滤数据列表
三:汉字转成拼音的成效,相当多时候兑现联系人或许城市列表等贯彻A-Z的排序成效,我们能够直接从数据库中赢得她的方块字拼音,而对此平日的多少,大家怎么贯彻A-Z的排序,这里自个儿使用了PinYin4j.jar将汉字调换为拼音.
遵照常规先来看一下最后效果图:

在做单词本的时候,由于后台平昔把全数的单词重返给本身,所以须要本身将它们按首字母A-Z进行归类且放进新的数组里头。

本人用的是vant那一个ui框架中的IndexBar组件 其实那些组件已经把须要的都弄好了 大家借使处理数量就好了

这两天在做储值结账,必要里结账首页必要按门店的首字母A-Z排序。笔者的数据结构原来是如此的:

大家就一步一步的来促成那么些页面,最后效果如下:

澳门新浦京娱乐场网站:打造一个可以快速索引的城市列表页,仿美团网。那边写图片描述

先看看管理前的数据 :

率先必要引入IndexBar组件 那一个就不再赘言了 官方网址写的很通晓

Array( [0] => Array ( [sid] => 2885842 [recetcstoredpay] => 24000 [recetclprinciple] => 23465 [paytcstoredpay] => 5455 [paytclprinciple] => 34900 [sname] => 百宴餐饮---便宜坊烤鸭店 ) [1] => Array ( [sid] => 3644191 [recetcstoredpay] => 89200 [recetclprinciple] => 406930 [paytcstoredpay] => 4090 [paytclprinciple] => 97800 [sname] => 大长秋餐饮中心 ) [2] => Array ( [sid] => 5229673 [recetcstoredpay] => 26000 [recetclprinciple] => 45930 [paytcstoredpay] => 24795 [paytclprinciple] => 121800 [sname] => 大众点评网 ) [3] => Array ( [sid] => 3715927 [recetcstoredpay] => 13600 [recetclprinciple] => 56930 [paytcstoredpay] => 5710 [paytclprinciple] => 37800 [sname] => 江东北路店 ) [4] => Array ( [sid] => 3671092 [recetcstoredpay] => 1280 [recetclprinciple] => 46930 [paytcstoredpay] => 128090 [paytclprinciple] => 149800 [sname] => 金凤区新馆 ) [5] => Array ( [sid] => 1858783 [recetcstoredpay] => 2040 [recetclprinciple] => 4465 [paytcstoredpay] => 245 [paytclprinciple] => 4900 [sname] => 浙江西子宾馆 ) [6] => Array ( [sid] => 16832117 [recetcstoredpay] => 81600 [recetclprinciple] => 470930 [paytcstoredpay] => 506090 [paytclprinciple] => 8000 [sname] => 欢乐谷店 ))

澳门新浦京娱乐场网站 1Paste_Image.png

接下去剖析下全方位功用模块的布局结构:
(1卡塔尔首先三个带删除开关的EditText,大家在输入框中输入大家探索的城堡能够自行过滤出最后的结果,当输入框中没有数量自动替换成原本的数额列表;
(2卡塔尔中间是近日坚持住的都市和火热的都市,此中火热城市接收到了GridView;
(3卡塔 尔(英语:State of Qatar)上面是一个ListView用来突显数据列表,侧边是一个字母索引表,当大家点击分歧的假名,ListView会定位到该字母地点
近日大家来看下项目布局图

澳门新浦京娱乐场网站 2管理前的数据.png

点击索引栏时,会自动跳转到对应的IndexAnchor锚点地方

依靠必要,要依附sname的率先个汉字首字母排序,那么就先需求写叁个取首字母的秘诀:

终超级大家会据守首字母中文拼音对具有城市开展排序,能够由此右边的首字母索引来快速牢固到城堡。

此地写图片描述

Share my code...

         ...
/*** 取汉字的第一个字的首字母* @param type $str* @return string|null*/public function _getFirstCharter{if{return '';}$fchar=ord;if&&$fchar<=ord return strtoupper;$s1=iconv('UTF-8','gb2312',$str);$s2=iconv;$s=$s2==$str?$s1:$str;$asc=ord-65536;if($asc>=-20319&&$asc<=-20284) return 'A';if($asc>=-20283&&$asc<=-19776) return 'B';if($asc>=-19775&&$asc<=-19219) return 'C';if($asc>=-19218&&$asc<=-18711) return 'D';if($asc>=-18710&&$asc<=-18527) return 'E';if($asc>=-18526&&$asc<=-18240) return 'F';if($asc>=-18239&&$asc<=-17923) return 'G';if($asc>=-17922&&$asc<=-17418) return 'H';if($asc>=-17417&&$asc<=-16475) return 'J';if($asc>=-16474&&$asc<=-16213) return 'K';if($asc>=-16212&&$asc<=-15641) return 'L';if($asc>=-15640&&$asc<=-15166) return 'M';if($asc>=-15165&&$asc<=-14923) return 'N';if($asc>=-14922&&$asc<=-14915) return 'O';if($asc>=-14914&&$asc<=-14631) return 'P';if($asc>=-14630&&$asc<=-14150) return 'Q';if($asc>=-14149&&$asc<=-14091) return 'R';if($asc>=-14090&&$asc<=-13319) return 'S';if($asc>=-13318&&$asc<=-12839) return 'T';if($asc>=-12838&&$asc<=-12557) return 'W';if($asc>=-12556&&$asc<=-11848) return 'X';if($asc>=-11847&&$asc<=-11056) return 'Y';if($asc>=-11055&&$asc<=-10247) return 'Z';return null;}

澳门新浦京娱乐场网站:打造一个可以快速索引的城市列表页,仿美团网。都会列表,下载地址:

根据项目中类的逐条来挨门挨户介绍
1.PinYin4j.jar用以将汉字转变为拼音,你还是能应用其余措施将壮汉调换为拼音,笔者事先有介绍过,这里就目不识丁讲啦,查究PinYin4j.jar将汉字转变为拼音的主干用法
2.CitySortModel一个实体类,贰个突显的都会和相呼应的拼音首字母

 let WordList = [];//处理后的数组 for(let i=0;i<26;i  ){ const key = String.fromCharCode //A-Z赋给key当作键 let map = {} map[key] = { title: key, items: [] } this.data.List.map=>{ //遍历单词本 let firstIndex = v.WordName.substr;//首字母 if(firstIndex.toUpperCase() == String.fromCharCode{//统一转成大写进行逐个判断 map[key].items.push(v.WordName)//push进相对应的数组里头 } }) //如果当前的数组里头为空,则跳过。 if(map[key].items === undefined || map[key].items.length == 0){ continue; }else{ WordList.push//将分类好的每个对象 合并在一个数组里面 } } //给data里头声明的WordList赋值。(这里的情景是小程序) this.setData({ WordList:WordList })

那是vant官方文书档案IndexBar的为主用克罗地亚语档

接下来下一步,要对这一个二维数据排序。笔者构思了非常久,后来想到了方案,先在循环里调用那个取首字母的不二等秘书诀,然后以这么些字母作为key,因为php里有依附key排序的方法,所以本人的代码写成那样就化解了:

链接: 密码: cjpw

package com.adan.selectcitydome.view;

public class CitySortModel {

    private String name;//显示的数据
    private String sortLetters;//显示数据拼音的首字母

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSortLetters() {
        return sortLetters;
    }

    public void setSortLetters(String sortLetters) {
        this.sortLetters = sortLetters;
    }
}

那是管理后的数额截图。顺利将单词按A-Z分类~

IndexAnchor私下认可是A-Z这里大家不用去自定义

//门店名称$shopData = $this->_shopNamesArray;//根据门店名称第一个汉字的首字母正序排序$settles = $result['data'];$settlesRes = array();foreach  { $sname = $shopData[$sett['sid']]; $sett['sname'] = $sname; $snameFirstChar = $this->_getFirstCharter; //取出门店的第一个汉字的首字母 $settlesRes[$snameFirstChar] = $sett;//以这个首字母作为key}ksort; //对数据进行ksort排序,以key的值升序排序
- (NSDictionary *)loadCityListData{ return [NSDictionary dictionaryWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"cityList.plist" withExtension:nil]];}

3.EditTextWithDel类是自定义的叁个带灭亡效用的输入框控件,也得以用Android原生的艾德itText,那几个类上生机勃勃篇博客有介绍,这里就不贴上代码了Android 带杀绝功效的输入框控件EditTextWithDel
4.MyGridView类正是自定义GridView,首倘使解决了在抢手城市中嵌套Grideview的显得不完全的难点

澳门新浦京娱乐场网站 3处理后.png

循环部分 笔者的思路是按每一种城市称号的第一个字母排序

先把那几个数量print出来看成效:

  • 字典中有叁本性能allKeys,能够取出字典中享有的key。这是叁个只读的属性。
  • 根据allKeys就能够明了字典中有稍许组,去相应的数据源设置重返数据。
package com.adan.selectcitydome.view;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.GridView;

/**
 * 自定义GridView,解决嵌套Grideview的显示不完全的问题
 */
public class MyGridView extends GridView {

    public MyGridView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public MyGridView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyGridView(Context context) {
        super(context);
    }

    /**
     * 其中onMeasure函数决定了组件显示的高度与宽度;
     * makeMeasureSpec函数中第一个函数决定布局空间的大小,第二个参数是布局模式
     * MeasureSpec.AT_MOST的意思就是子控件需要多大的控件就扩展到多大的空间
     */
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
                MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }

}

小结

这种管理方式尽管能落时间效益果与利益不过在性质方面影响不小。想意气风发想,for循环嵌套map遍历,假如原先的数高管度超大,那一个管理速度一定相当慢。参照他事他说加以考察下笔者同事的做法~老妪能解。比♥

封装个formatList(arr,keyword)方法。arr亟需处理的数组名称,keyword数组里头的字段名。

function formatList(arr,keyword) { let newArr1 = []; let tempArr = []; let reg = /b|s/g; let k = 0; let firstWord = arr[0][keyword].charAt.toUpperCase();//获取第一个分类字母 arr.map => { v[keyword] = v[keyword].replace(reg,m=>m.toUpperCase;//首字母大写 if(firstWord == v[keyword].charAt{ tempArr.push; newArr1[k] = { Title:firstWord, List:tempArr } }else{ //这里循环到这表示已经第二个字母了 firstWord = v[keyword].charAt;//设置第二字母 tempArr = [];//把之前的清除掉 tempArr.push;//添加第一个 newArr1[  k] = {//自增 Title: firstWord, List : tempArr } } }); return newArr1;}

措施调用

 var newList = formatList(list,'WordName');

好了~学习一波先。喜欢的朋侪们能够点个赞哦。

{ "id": 101, "name": "北京市", "pid": 1, "code": 0},{ "id": 10101, "name": "天津市", "pid": 10001, "code": 0},{ "id": 20101, "name": "石家庄市", "pid": 20001, "code": 130100} 
Array( [B] => Array ( [sid] => 2885842 [recetcstoredpay] => 24000 [recetclprinciple] => 23465 [paytcstoredpay] => 5455 [paytclprinciple] => 34900 [sname] => 百宴餐饮---便宜坊烤鸭店 ) [D] => Array ( [sid] => 5229673 [recetcstoredpay] => 26000 [recetclprinciple] => 45930 [paytcstoredpay] => 24795 [paytclprinciple] => 121800 [sname] => 大众点评网 ) [H] => Array ( [sid] => 16832117 [recetcstoredpay] => 81600 [recetclprinciple] => 470930 [paytcstoredpay] => 506090 [paytclprinciple] => 8000 [sname] => 欢乐谷店 ) [J] => Array ( [sid] => 3671092 [recetcstoredpay] => 1280 [recetclprinciple] => 46930 [paytcstoredpay] => 128090 [paytclprinciple] => 149800 [sname] => 金凤区新馆 ) [Z] => Array ( [sid] => 1858783 [recetcstoredpay] => 2040 [recetclprinciple] => 4465 [paytcstoredpay] => 245 [paytclprinciple] => 4900 [sname] => 浙江西子宾馆 ))

5.PinyinComparator类用来对ListView中的数据依据A-Z举办排序,前边五个if判定主借使将不是以汉字最早的数量放在前边

因为前面的多寡很乱 所以作者让后台老哥重新写了一个只含有市级城市的列表 那样就可怜好管理了

PS:这里再为大家推荐2款相比实用的连锁在线排序工具供大家参谋使用:

@property (readonly, copy) NSArray<KeyType> *allKeys;
package com.adan.selectcitydome.view;

import java.util.Comparator;

/**
 * 用来对ListView中的数据根据A-Z进行排序,前面两个if判断主要是将不是以汉字开头的数据放在后面
 */
public class PinyinComparator implements Comparator<CitySortModel> {

    public int compare(CitySortModel o1, CitySortModel o2) {
        //这里主要是用来对ListView里面的数据根据ABCDEFG...来排序
        if (o1.getSortLetters().equals("@")
                || o2.getSortLetters().equals("#")) {
            return -1;
        } else if (o1.getSortLetters().equals("#")
                || o2.getSortLetters().equals("@")) {
            return 1;
        } else {
            return o1.getSortLetters().compareTo(o2.getSortLetters());
        }
    }
}

率先步先把城市的名目抽取

在线中芬兰语遵照首字母排序工具:

  • 对具备字典key的数组中的内容开展排序
  • 对于排序,系统提供了二种情势能够扩充排序。大家就毫无再写什么冒泡儿、选拔之类的算法了,直接来就足以用。

6.PinyinUtils类,正是率先点所讲的PinYin4j.jar用于将汉字转变为拼音啦,这里就不粘贴代码啦
7.SideBar类正是ListView侧边的字母索引View,我们须求接受setTextView(TextView mTextDialog)来设置用来展示当前按下的字母的TextView,以至使用setOnTouchingLetterChangedListener方法来安装回调接口,在回调方法onTouchingLetterChanged(String s)中来管理分化的操作

let cityNameList = []for{ cityNameList.push}

在线文本倒序翻转排序工具:

package com.adan.selectcitydome.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;

import com.adan.selectcitydome.R;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * ListView右侧的字母索引View
 */
public class SideBar extends View {

    public static String[] INDEX_STRING = {"A", "B", "C", "D", "E", "F", "G", "H", "I",
            "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V",
            "W", "X", "Y", "Z"};

    private OnTouchingLetterChangedListener onTouchingLetterChangedListener;
    private List<String> letterList;
    private int choose = -1;
    private Paint paint = new Paint();
    private TextView mTextDialog;

    public SideBar(Context context) {
        this(context, null);
    }

    public SideBar(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public SideBar(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    private void init() {
        setBackgroundColor(Color.parseColor("#F0F0F0"));
        letterList = Arrays.asList(INDEX_STRING);
    }

    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        int height = getHeight();// 获取对应高度
        int width = getWidth();// 获取对应宽度
        int singleHeight = height / letterList.size();// 获取每一个字母的高度
        for (int i = 0; i < letterList.size(); i  ) {
            paint.setColor(Color.parseColor("#606060"));
            paint.setTypeface(Typeface.DEFAULT_BOLD);
            paint.setAntiAlias(true);
            paint.setTextSize(20);
            // 选中的状态
            if (i == choose) {
                paint.setColor(Color.parseColor("#4F41FD"));
                paint.setFakeBoldText(true);
            }
            // x坐标等于中间-字符串宽度的一半.
            float xPos = width / 2 - paint.measureText(letterList.get(i)) / 2;
            float yPos = singleHeight * i   singleHeight / 2;
            canvas.drawText(letterList.get(i), xPos, yPos, paint);
            paint.reset();// 重置画笔
        }
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        final int action = event.getAction();
        final float y = event.getY();// 点击y坐标
        final int oldChoose = choose;
        final OnTouchingLetterChangedListener listener = onTouchingLetterChangedListener;
        final int c = (int) (y / getHeight() * letterList.size());// 点击y坐标所占总高度的比例*b数组的长度就等于点击b中的个数.

        switch (action) {
            case MotionEvent.ACTION_UP:
                setBackgroundColor(Color.parseColor("#F0F0F0"));
                choose = -1;
                invalidate();
                if (mTextDialog != null) {
                    mTextDialog.setVisibility(View.GONE);
                }
                break;
            default:
                setBackgroundResource(R.drawable.sidebar_background);
                if (oldChoose != c) {
                    if (c >= 0 && c < letterList.size()) {
                        if (listener != null) {
                            listener.onTouchingLetterChanged(letterList.get(c));
                        }
                        if (mTextDialog != null) {
                            mTextDialog.setText(letterList.get(c));
                            mTextDialog.setVisibility(View.VISIBLE);
                        }
                        choose = c;
                        invalidate();
                    }
                }
                break;
        }
        return true;
    }

    public void setIndexText(ArrayList<String> indexStrings) {
        this.letterList = indexStrings;
        invalidate();
    }

    /**
     * 为SideBar设置显示当前按下的字母的TextView
     *
     * @param mTextDialog
     */
    public void setTextView(TextView mTextDialog) {
        this.mTextDialog = mTextDialog;
    }

    /**
     * 向外公开的方法
     *
     * @param onTouchingLetterChangedListener
     */
    public void setOnTouchingLetterChangedListener(
            OnTouchingLetterChangedListener onTouchingLetterChangedListener) {
        this.onTouchingLetterChangedListener = onTouchingLetterChangedListener;
    }

    /**
     * 接口
     */
    public interface OnTouchingLetterChangedListener {
        void onTouchingLetterChanged(String s);
    }

}

ok将来大家就把城市的名号存到了cityNameList中了

愈来愈多关于PHP相关内容感兴趣的读者可查看本站专项论题:《php排序算法总计》、《PHP数组操作技艺大全》、《php字符串用法总计》、《php常用函数与技艺总计》、《PHP错误与特别管理措施总括》、《php面向对象程序设计入门教程》及《php不认为奇数据库操作手艺汇总》

 _firstLetterOfCitys = [_firstLetterOfCitys sortedArrayUsingSelector:@selector];

 _firstLetterOfCitys = [_firstLetterOfCitys sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {// 升序排序 return [obj1 compare:obj2]; // 将序排序 return [obj2 compare:obj1]; // 乱序 return arc4random_uniform % 3 - 1; }];

8.CityAdapter正是热门城市中GridView的适配器

上面一步正是非同通常的一步了 直接将数组的首字母收取来并依照A-Z排序这里运用了贰个插件pinyin 用它来将汉语的首字母抽取来首先安装

瞩望本文所述对我们PHP程序设计有所帮助。

  • 因而是能够排序,是每回obj1和obj2比较都进展了叁遍排序。排序结果记录在了NSComparisonReuslt中。
  • NSComparisonReuslt是一个枚举。通过操作两数比较的结果,进行排序。如若两数相比较的结果一瞬间是-1,须臾是0,弹指是1,那排序出来的结果也正是乱的。
package com.adan.selectcitydome;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.LinearLayout;

import java.util.List;

/**
 * @author: xiaolijuan
 * @description:
 * @projectName: SelectCityDome
 * @date: 2016-03-01
 * @time: 17:25
 */
public class CityAdapter extends ArrayAdapter<String> {
    /**
     * 需要渲染的item布局文件
     */
    private int resource;

    public CityAdapter(Context context, int textViewResourceId, List<String> objects) {
        super(context, textViewResourceId, objects);
        resource = textViewResourceId;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LinearLayout layout = null;
        if (convertView == null) {
            layout = (LinearLayout) LayoutInflater.from(getContext()).inflate(resource, null);
        } else {
            layout = (LinearLayout) convertView;
        }
        Button name = (Button) layout.findViewById(R.id.tv_city);
        name.setText(getItem(position));
        return layout;
    }
}
npm install js-pinyin

官方对此表达:

9.SortAdapter 数量的适配器类,这里大家须要采纳的正是SectionIndexer接口,它能够使得地援助大家对分组进行支配。使用SectionIndexer接口供给贯彻八个形式:getSectionForPosition(int position),getPositionForSection(int section),getSections(),大家只须求活动完结前边八个办法:
(意气风发卡塔 尔(英语:State of Qatar)getSectionForPosition(int position)是依赖ListView的position来寻找脚下职分所在的分组
getPositionForSection(int section)正是依据首字母的Char值来获得在该ListView中率先次现身该首字母的岗位,也正是日前分组所在的职位

然后自个儿是在mian.js中引进的

typedef NS_ENUM(NSInteger, NSComparisonResult) {NSOrderedAscending = -1L, NSOrderedSame, NSOrderedDescending};
package com.adan.selectcitydome;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.SectionIndexer;
import android.widget.TextView;

import com.adan.selectcitydome.view.CitySortModel;

import java.util.List;

public class SortAdapter extends BaseAdapter implements SectionIndexer {
    private List<CitySortModel> list = null;
    private Context mContext;

    public SortAdapter(Context mContext, List<CitySortModel> list) {
        this.mContext = mContext;
        this.list = list;
    }

    /**
     * 当ListView数据发生变化时,调用此方法来更新ListView
     *
     * @param list
     */
    public void updateListView(List<CitySortModel> list) {
        this.list = list;
        notifyDataSetChanged();
    }

    public int getCount() {
        return this.list.size();
    }

    public Object getItem(int position) {
        return list.get(position);
    }

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

    public View getView(final int position, View view, ViewGroup arg2) {
        ViewHolder viewHolder = null;
        final CitySortModel mContent = list.get(position);
        if (view == null) {
            viewHolder = new ViewHolder();
            view = LayoutInflater.from(mContext).inflate(R.layout.item_select_city, null);
            viewHolder.tvTitle = (TextView) view.findViewById(R.id.tv_city_name);
            view.setTag(viewHolder);
            viewHolder.tvLetter = (TextView) view.findViewById(R.id.tv_catagory);
        } else {
            viewHolder = (ViewHolder) view.getTag();
        }

        int section = getSectionForPosition(position);

        if (position == getPositionForSection(section)) {
            viewHolder.tvLetter.setVisibility(View.VISIBLE);
            viewHolder.tvLetter.setText(mContent.getSortLetters());
        } else {
            viewHolder.tvLetter.setVisibility(View.GONE);
        }

        viewHolder.tvTitle.setText(this.list.get(position).getName());

        return view;

    }


    final static class ViewHolder {
        TextView tvLetter;
        TextView tvTitle;
    }

    public int getSectionForPosition(int position) {
        return list.get(position).getSortLetters().charAt(0);
    }

    public int getPositionForSection(int section) {
        for (int i = 0; i < getCount(); i  ) {
            String sortStr = list.get(i).getSortLetters();
            char firstChar = sortStr.toUpperCase().charAt(0);
            if (firstChar == section) {
                return i;
            }
        }
        return -1;
    }

    @Override
    public Object[] getSections() {
        return null;
    }
}
import pinyin from 'js-pinyin'
  • 边栏的目录显示的文字和实际跳转未有直接关系。
  • 边栏索引无论写什么,都以比照实际的key值进行跳转的。

10.MainActivity 对EditTextWithDel设置addTextChangedListener监听,当输入框内容发生变化依据个中的值过滤ListView,里面包车型大巴值为空突显原本的列表和给ListView增添表头等

然后在您的专门的学业页面配置

package com.adan.selectcitydome;

import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.adan.selectcitydome.view.CitySortModel;
import com.adan.selectcitydome.view.EditTextWithDel;
import com.adan.selectcitydome.view.PinyinComparator;
import com.adan.selectcitydome.view.PinyinUtils;
import com.adan.selectcitydome.view.SideBar;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class MainActivity extends Activity {
    private ListView sortListView;
    private SideBar sideBar;
    private TextView dialog, mTvTitle;
    private SortAdapter adapter;
    private EditTextWithDel mEtCityName;
    private List<CitySortModel> SourceDateList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initViews();
    }

    private void initViews() {
        mEtCityName = (EditTextWithDel) findViewById(R.id.et_search);
        sideBar = (SideBar) findViewById(R.id.sidrbar);
        dialog = (TextView) findViewById(R.id.dialog);
        mTvTitle = (TextView) findViewById(R.id.tv_title);
        sortListView = (ListView) findViewById(R.id.country_lvcountry);
        initDatas();
        initEvents();
        setAdapter();
    }

    private void setAdapter() {
        SourceDateList = filledData(getResources().getStringArray(R.array.provinces));
        Collections.sort(SourceDateList, new PinyinComparator());
        adapter = new SortAdapter(this, SourceDateList);
        sortListView.addHeaderView(initHeadView());
        sortListView.setAdapter(adapter);
    }

    private void initEvents() {
        //设置右侧触摸监听
        sideBar.setOnTouchingLetterChangedListener(new SideBar.OnTouchingLetterChangedListener() {
            @Override
            public void onTouchingLetterChanged(String s) {
                //该字母首次出现的位置
                int position = adapter.getPositionForSection(s.charAt(0));
                if (position != -1) {
                    sortListView.setSelection(position   1);
                }
            }
        });

        //ListView的点击事件
        sortListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) {
                mTvTitle.setText(((CitySortModel) adapter.getItem(position - 1)).getName());
                Toast.makeText(getApplication(), ((CitySortModel) adapter.getItem(position)).getName(), Toast.LENGTH_SHORT).show();
            }
        });

        //根据输入框输入值的改变来过滤搜索
        mEtCityName.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                //当输入框里面的值为空,更新为原来的列表,否则为过滤数据列表
                filterData(s.toString());
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });
    }

    private void initDatas() {
        sideBar.setTextView(dialog);
    }

    private View initHeadView() {
        View headView = getLayoutInflater().inflate(R.layout.headview, null);
        GridView mGvCity = (GridView) headView.findViewById(R.id.gv_hot_city);
        String[] datas = getResources().getStringArray(R.array.city);
        ArrayList<String> cityList = new ArrayList<>();
        for (int i = 0; i < datas.length; i  ) {
            cityList.add(datas[i]);
        }
        CityAdapter adapter = new CityAdapter(getApplicationContext(), R.layout.gridview_item, cityList);
        mGvCity.setAdapter(adapter);
        return headView;
    }

    /**
     * 根据输入框中的值来过滤数据并更新ListView
     *
     * @param filterStr
     */
    private void filterData(String filterStr) {
        List<CitySortModel> mSortList = new ArrayList<>();
        if (TextUtils.isEmpty(filterStr)) {
            mSortList = SourceDateList;
        } else {
            mSortList.clear();
            for (CitySortModel sortModel : SourceDateList) {
                String name = sortModel.getName();
                if (name.toUpperCase().indexOf(filterStr.toString().toUpperCase()) != -1 || PinyinUtils.getPingYin(name).toUpperCase().startsWith(filterStr.toString().toUpperCase())) {
                    mSortList.add(sortModel);
                }
            }
        }
        // 根据a-z进行排序
        Collections.sort(mSortList, new PinyinComparator());
        adapter.updateListView(mSortList);
    }

    private List<CitySortModel> filledData(String[] date) {
        List<CitySortModel> mSortList = new ArrayList<>();
        ArrayList<String> indexString = new ArrayList<>();

        for (int i = 0; i < date.length; i  ) {
            CitySortModel sortModel = new CitySortModel();
            sortModel.setName(date[i]);
            String pinyin = PinyinUtils.getPingYin(date[i]);
            String sortString = pinyin.substring(0, 1).toUpperCase();
            if (sortString.matches("[A-Z]")) {
                sortModel.setSortLetters(sortString.toUpperCase());
                if (!indexString.contains(sortString)) {
                    indexString.add(sortString);
                }
            }
            mSortList.add(sortModel);
        }
        Collections.sort(indexString);
        sideBar.setIndexText(indexString);
        return mSortList;
    }
}
let pinyin = requirepinyin.setOptions({checkPolyphone:false,charCase:0})
- (NSArray<NSString *> *)sectionIndexTitlesForTableView:(UITableView *)tableView{ return _firstLetterOfCitys;}

布局文件就不贴出来了,风乐趣的能够下载代码,有哪些难题的,请在底下留言,多谢各位_
本项目校正自http://blog.csdn.net/xiaanming/article/details/12684155
源代码请戳这里:Android 仿美团网,索求ListView的A-Z字母排序作用完结选取省份只怕城市

平素一个生生不息达到大家的功力

  • 不无的类措施在实践起先化的时候都亟需先去看看类里面起头化的方法首推项。
let firstName = {};this.FirstPin.forEach=>{ firstName[item] = []; cityNameList.forEach=>{ let first = pinyin.getFullChars; if{ firstName[item].push

以UITableView为例

那边的FirstPin是在data中定义的三个数组,用来存款和储蓄A-Z

NS_CLASS_AVAILABLE_IOS @interface UITableView : UIScrollView <NSCoding>- (instancetype)initWithFrame:frame style:(UITableViewStyle)style NS_DESIGNATED_INITIALIZER; // must specify style at creation. -initWithFrame: calls this with UITableViewStylePlain- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER;
 FirstPin: ["A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "Q", "R", "S", "T", "W", "X", "Y", "Z"],

法定认证的意思是说,当实行init的时候,系统必要施行了四个最早化方法。

然后作者的firstName的格式是那样的

主题材料来了:若果在开始化的时候,写成了[[UITableView alloc] init],在编写翻译的时候实在依然实行了多少个开始化方法。第壹个起头化方法中必要传入frame,那时候因为还没传到参数,frame就能被默以为{0.0.0.0}。

firName:{ A:["阿拉善盟","鞍山市"]}

为明白决这几个主题材料,当view有了frame之后,就必要再行给tableView设置frame。是用以下形式开展设置:

终极在InderBar组件中写五个巡回就足以了

- layoutSubviews{ [super layoutSubviews]; _tableView.frame = self.bounds;}
  {{index}}   

因为城市列表以后我们很有望会在其余品种里面使用,但大家又不明确现在再利用的时候是用StoryBoard调用依旧代码调用。所以大家还要尤其处理一下。

如上正是本文的全体内容,希望对大家的就学抱有助于,也指望大家不吝赐教脚本之家。

//当从XIB或者UIStoryboard中创建UITableView的时候加载此方法- awakeFromNib{ [super awakeFromNib]; [self createCityListTableView];}//使用代码创建的时候加载此方法- (instancetype)initWithFrame:frame{ self = [super initWithFrame:frame]; if  { [self createCityListTableView]; } return self;}

如此即使是封装好了,以往不管是SB还是代码格局,都得以直接的把刚刚写好的都会列表进行引用了。

本文由澳门新浦京娱乐场网站发布于服务器,转载请注明出处:澳门新浦京娱乐场网站:打造一个可以快速索引