android通讯录根据首字母分组(二)

不打游戏了,继续写。
先看一看listView的适配器怎么写吧。
首先构造函数

public MyAdapter(JSONArray dataList ,LetterComparator lc,Context context) {
        Collections.sort(dataList, lc);
        this.dataList = dataList;
        this.lc = lc;
        this.context = context;
        Class drawable = R.drawable.class;
        fields = drawable.getFields();
    }

这个类很吊,LetterComparator,,就是他把首字母一样的英雄名字放在一起的。比如:阿狸 和 艾希 首字母都是 a,,大兵和队友首字母都是d.通过这个去排序的。

public class LetterComparator implements Comparator {

    @Override
    public int compare(Object lhs, Object rhs) {
        JSONObject c1 = (JSONObject) lhs;
        JSONObject c2 = (JSONObject) rhs;
        Collator myCollator = Collator.getInstance(java.util.Locale.ENGLISH);
        if (myCollator.compare(c1.getString("SZM"), c2.getString("SZM")) < 0)
            return -1;
        else if (myCollator.compare(c1.getString("SZM"), c2.getString("SZM")) > 0)
            return 1;
        else
            return 0;
    }
}

然后就是Adapter最终要的getView()方法了。
这个方法很吊,聪明的像狗一样的我都快看不懂了,就不贴了 。看不懂就问我吧,呆会儿把源代码放上去的。
LIstVIew滑动监听,动态更新顶部TextView

//listView的滑动监听
    private class MyScrollListener implements OnScrollListener {

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem,
                int visibleItemCount, int totalItemCount) {

            ListView listview = (ListView) view;

            if (firstVisibleItem >= 0) {
                for (int i = 0; i < visibleItemCount; i++) {
                    ViewGroup convertView = (ViewGroup) listview.getChildAt(i);  //遍历得到所有可见的item

                    if (convertView != null) {
                        group_index.setText(convertView.getTag(R.id.tag)
                                .toString());
                        break;
                    }
                }
            }
        }

        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {

        }
    }

这里的逻辑是,遍历屏幕上可见的几个条目,在Adapter中我们给每个条目都设置了一个Tag,在这里我们就是根据这个Tag,得到我们的顶部TextView应该显示的字母。

private void searchContent(String keyWord) {
        if(!keyWord.isEmpty()){
            JSONArray tempArray = new JSONArray();
            for(int i = 0;i<dataList.size();i++){
                JSONObject object = dataList.getJSONObject(i);
                //检索电话
                String mobile = object.getString("mobilemobile");
                if(mobile != null){
                    if(isNumber(mobile) && mobile.contains(keyWord)){
                        tempArray.add(object);
                        continue;
                    }   
                }
                //检索首字母
                String firstZM = object.getString("firstZM");
                if(mobile != null){
                    if(keyWord.length() == 1 && keyWord.toUpperCase().equals(firstZM)){
                        tempArray.add(object);
                        continue;
                    }   
                }
                //检索汉字
                String CN = object.getString("CN");
                String  a = CN.charAt(0)+"";

                if(mobile != null){
                    if(keyWord.equals(a)){
                        tempArray.add(object);
                        continue;
                    }   
                }
            }
            dataList.clear();
            dataList.addAll(tempArray);
            Collections.sort(dataList, lc);
            adapter.notifyDataSetChanged(); 
        }else{
            dataList.clear();
            dataList.addAll(jsonArray);
            Collections.sort(dataList, lc);
            adapter.notifyDataSetChanged(); 
        }   
    }

给顶部的EditText设置文字改变监听,然后循环遍历,得到我们想要的数据,通知适配器刷新数据。
好吧,如果我看这样的博客,我是看不懂的,把源代码发上来,要看的自己看的,不懂的女程序员私聊,男的自己debug。
女神镇楼。写的不好,不要骂我,我小学生。
链接奉上。
听说点这里可以下载源码
这里写图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值