最近開發有個需求是以A-Z的方式區分全國城市(搜索功能),並實現字母索引的功能(有點類似微信,不過比較坑的是用的是GridView,
並且GridView上面還有幾個LinearLayout)。
詳細說下需求:界面的最上面有個TextView,顯示“自動定位到的城市”,接着下面是當前點位到的城市;再下面是TextView(”熱門城市“),
再下是GridView顯示的熱門城市(不按字母分模塊),再下面是TextView(”所有城市“),最后就是GridView嵌套GridView顯示所有城市(以A-Z分模塊)。
(其實用ListView嵌套GridView是一樣的)
不看文字的看圖吧:
另外說下,bar下面就是一個ScrollView。熱門城市這些都比較好實現,當GridView顯示所有城市的時候,就顯示不全了(印象中是只顯示到T,XYZ等顯示不出來)。
按照網上的方法各種重寫GridView和ScrollView,顯然還是沒有效果。重寫的代碼如下:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub
int expandSpec = MeasureSpec.makeMeasureSpec(
Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
網上有說到,是GridView的item布局高度計算不正確,然后又是各種獲取item,各種計算,結果還是不行。
沒辦法,上面催得緊。只能用古老的方法(勿噴)。
用LinearLayout替換第二個GridView,然后LinearLayout里面嵌套GridView,首先把獲取到的所有城市按A-Z分開(非A-Z的算#,這個后面再說),通過
gridView.setAdapter和linearLayout.addView方式,終於實現了如圖的效果。Item的點擊事件在GridViewAdapter中添加,通過自定義接口回調點擊事件。
這里說一下字母索引的功能:右邊的字母控件是自定義(網上一大推)TextView,滑動或點擊后有一個回調函數,將當前點擊或滑動到的值回調,然后通過一個
TextView放大展示(不懂看微信)。在linearLayout.addView的時候,我把一個linearLayout的item(也就是gridView)對應的position存放到一個HashMap,
也就是key=字母,value=position。當滑動或點擊時,拿到的回調參數從HashMap把position取出來,再通過linearLayout.getChildAt(position).getY()獲取
到該item的Y坐標,最后通過srollView.scrollTo(0, (int)y),完美實現字母索引。
此外,漢字轉拼音的功能,使用的是pinyin4j-2.5.0.jar開源庫(轉換的數據有一些是不准確(例如“長沙” “changsha”,被轉換成“zhangsha”)),不過針對特殊的
數據可以特殊處理了。
差不多就這樣子了,先去研究下重寫GridView和ScrollView,依然還是顯示不全的問題吧.