android实现分组字母索引显示的listview
来源:互联网 发布:翻唱网络歌手怎么赚钱 编辑:程序博客网 时间:2024/05/11 01:06
最近项目中有一个通讯录的模块,为了使体验效果更佳,和系统通讯录一样可以分组索引,于是自己用framlayout,嵌套listview和分组索引的布局方式实现的
我的代码中,写了两个界面实现,其中一个是添加对象list,另一个是string数组用到了排序,具体逻辑也不一样,我推荐使用前者;
先贴张效果图;
下面就说下我的实现思路和具体代码:
布局文件如下:
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 android:layout_width="fill_parent" 3 android:layout_height="match_parent" 4 android:background="#ffffff" 5 android:orientation="vertical" > 6 7 <TextView 8 android:layout_width="fill_parent" 9 android:layout_height="wrap_content"10 android:padding="10dp"11 android:textColor="#000"12 android:textSize="16sp"13 android:text="分组索引listview列表" />14 15 <FrameLayout16 android:layout_width="match_parent"17 android:layout_height="match_parent"18 android:background="#ffffff" >19 20 <ListView21 android:id="@+id/listView1"22 android:layout_width="match_parent"23 android:layout_height="wrap_content" >24 </ListView>25 26 <TextView27 android:id="@+id/tv"28 android:layout_width="60dp"29 android:layout_height="60dp"30 android:layout_gravity="center"31 android:background="#f0606060"32 android:gravity="center"33 android:text="A"34 android:textColor="#ffffff"35 android:textSize="30sp" />36 37 <LinearLayout38 android:id="@+id/layout"39 android:layout_width="wrap_content"40 android:layout_height="fill_parent"41 android:layout_gravity="right"42 android:background="#d7d7d7"43 android:gravity="center"44 android:orientation="vertical" >45 </LinearLayout>46 </FrameLayout>47 48 </LinearLayout>
图上看到的字母索引列表,是用过动态生成的,首先需要一个存放英文字母的数组
其中,给最外面的linearlayout添加onTouch事件,滑动时获取当前滑动的是哪一个字母索引,然后在listview查找item中存在的字段显示在最前面
1 /** 绘制索引列表 */ 2 public void getIndexView() { 3 LinearLayout.LayoutParams params = new LayoutParams( 4 LayoutParams.WRAP_CONTENT, height); 5 // params.setMargins(10, 5, 10, 0); 6 for (int i = 0; i < str.length; i++) { 7 final TextView tv = new TextView(this); 8 tv.setLayoutParams(params); 9 tv.setText(str[i]);10 // tv.setTextColor(Color.parseColor("#606060"));11 // tv.setTextSize(16);12 tv.setPadding(10, 0, 10, 0);13 layoutIndex.addView(tv);14 layoutIndex.setOnTouchListener(new OnTouchListener() {15 16 @Override17 public boolean onTouch(View v, MotionEvent event)18 19 {20 float y = event.getY();21 int index = (int) (y / height);22 if (index > -1 && index < str.length) {// 防止越界23 String key = str[index];24 if (adapter.getSelector().containsKey(key)) {25 int pos = adapter.getSelector().get(key);26 if (listView.getHeaderViewsCount() > 0) {// 防止ListView有标题栏,本例中没有。27 listView.setSelectionFromTop(28 pos + listView.getHeaderViewsCount(), 0);29 } else {30 listView.setSelectionFromTop(pos, 0);// 滑动到第一项31 }32 tv_show.setVisibility(View.VISIBLE);33 tv_show.setText(str[index]);34 }35 }36 switch (event.getAction()) {37 case MotionEvent.ACTION_DOWN:38 layoutIndex.setBackgroundColor(Color39 .parseColor("#606060"));40 break;41 42 case MotionEvent.ACTION_MOVE:43 44 break;45 case MotionEvent.ACTION_UP:46 layoutIndex.setBackgroundColor(Color47 .parseColor("#00ffffff"));48 tv_show.setVisibility(View.INVISIBLE);49 break;50 }51 return true;52 }53 });54 }55 }
然后关键的地方是在adapter中
1)中间显示对应的分组字母,通过隐藏和显示的方式控制
2)遍历字母数组和当前数据源,将对应字母在adapter中的position保存起来
View Code
package com.allen.indexablelist;import java.util.HashMap;import java.util.List;import java.util.Map;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.TextView;/** 实现Filterable接口,编写过滤规则 */public class NoteBookadapter extends BaseAdapter { private Context ctx; private ViewHolder holder; List<NoteBookItem> list; Map<String, Integer> selector;//键值是索引表的字母,值为对应在listview中的位置 /** 字母表 */ String index[]; public NoteBookadapter(Context context, List<NoteBookItem> list, String[] index) { this.ctx = context; this.list = list; this.index = index; selector = new HashMap<String, Integer>(); for (int j = 0; j < index.length; j++) {// 循环字母表,找出list中对应字母的位置 for (int i = 0; i < list.size(); i++) { if (list.get(i).index.equals(index[j].toLowerCase())) selector.put(index[j], i); } } } @Override public int getCount() { // TODO Auto-generated method stub return list.size(); } @Override public Object getItem(int arg0) { // TODO Auto-generated method stub return list.get(arg0); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { try { if (convertView == null) { holder = new ViewHolder(); convertView = LayoutInflater.from(ctx).inflate( R.layout.note_item, null); holder.tv1 = (TextView) convertView.findViewById(R.id.tv1); holder.tv2 = (TextView) convertView.findViewById(R.id.tv2); holder.iv = (ImageView) convertView.findViewById(R.id.iv_phone); holder.tv3 = (TextView) convertView.findViewById(R.id.tv3); holder.layout = convertView.findViewById(R.id.layout); holder.index = (TextView) convertView .findViewById(R.id.tv_index); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } // 绑定数据 NoteBookItem item = list.get(position); holder.tv1.setText(item.name); if (item.number.equals("null")) holder.tv2.setText(item.mobile); else holder.tv2.setText(item.number); holder.tv3.setText(item.call); // 显示index String currentStr = item.index; // 上一项的index String previewStr = (position - 1) >= 0 ? list.get(position - 1).index : " "; /** * 判断是否上一次的存在 */ if (!previewStr.equals(currentStr)) { holder.index.setVisibility(View.VISIBLE); holder.index.setText(currentStr);//中奖提示的文本显示当前滑动的字母 } else { holder.index.setVisibility(View.GONE); } } catch (OutOfMemoryError e) { Runtime.getRuntime().gc(); } catch (Exception ex) { // handler.sendEmptyMessage(CommonMessage.PARSE_ERROR); ex.printStackTrace(); } return convertView; } class ViewHolder { ImageView iv; TextView tv1; TextView tv2; TextView tv3; View layout; /** 索引字母 */ TextView index; } public Map<String, Integer> getSelector() { return selector; } public void setSelector(Map<String, Integer> selector) { this.selector = selector; } public String[] getIndex() { return index; } public void setIndex(String[] index) { this.index = index; }}
最后我把代码贴上点击下载:我这种方式实现虽然跟大牛写的不一样,但是基本功能实现了就行
<script type="text/javascript"><!--google_ad_client = "ca-pub-1944176156128447";/* cnblogs 首页横幅 */google_ad_slot = "5419468456";google_ad_width = 728;google_ad_height = 90;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
- android实现分组字母索引显示的listview
- android实现分组字母索引显示的listview
- Android ListView实现分组字母索引排序
- android之ListView分组及字母索引导航
- Android ListView侧边字母索引栏SideBar控件的实现
- Android UI ListView实现字母索引 定位
- 简单记录,右侧字母导航索引首字母分组的listview
- Android中ListView实现多级分组显示的高效实现
- Android ListView的分组显示,分组标题悬浮,点击查看分组的功能实现
- android 字母索引 listview
- 快速集成android实现listview的字母A-Z排序,界面侧边字母索引
- 快速集成android实现listview的字母A-Z排序,界面侧边字母索引
- Android Listview的分组实现
- android ListView分组显示
- Android 分组ListView+索引条
- android之ListView分组及字母索引导航(2)重构-接口
- Android ListView城市列表,按a-z分组字母索引排序
- Android listview实现分组
- 如何把图片整合到war3的mpq文件中作为登录背景界面
- zoj 3642 Just Another Information Sharing Problem
- epoll基础
- 自己在VPS上使用 Flask + sqlalchemy + jinja2 + nginx + mysql 架一个小站
- java类导入properties的问题
- android实现分组字母索引显示的listview
- 苹果企业证书过期-描述文件过期的方案
- System V IPC
- 重学C++ 带this指针的串联式成员函数调用
- Rabin-Miller算法的设计与实现
- Shape of HDU+向量积判断角度范围
- Servlet 工作原理解析
- SQL——联结表
- android图片添加文字保存到指定文件夹