列表按照字母排序检索SideBar

项目中要求列表按照ABCD这种字母排序检索的功能,看了大神写的,瞬间崇拜了,接下来借大家参考参考了

首先是自定义view sidebar

  1 /**
  2  * @author J
  3  *一个自定义view 实现a-z的竖直绘制,和监听滑动事件
  4  */
  5 public class SideBar extends View {
  6     private OnTouchingLetterChangedListener onTouchingLetterChangedListener;
  7     public static String[] b = { "A", "B", "C", "D", "E", "F", "G", "H", "I",
  8             "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V",
  9             "W", "X", "Y", "Z", "#" };
 10     private int choose = -1;
 11     private Paint paint = new Paint();
 12
 13     private TextView mTextDialog;
 14
 15     public void setTextView(TextView mTextDialog) {
 16         this.mTextDialog = mTextDialog;
 17     }
 18
 19     public SideBar(Context context, AttributeSet attrs, int defStyle) {
 20         super(context, attrs, defStyle);
 21     }
 22
 23     public SideBar(Context context, AttributeSet attrs) {
 24         super(context, attrs);
 25     }
 26
 27     public SideBar(Context context) {
 28         super(context);
 29     }
 30
 31     protected void onDraw(Canvas canvas) {
 32         super.onDraw(canvas);
 33         int height = getHeight();
 34         int width = getWidth();
 35         int singleHeight = height / b.length;
 36
 37         for (int i = 0; i < b.length; i++) {
 38             paint.setColor(Color.parseColor("#333333"));
 39 //            paint.setColor(Color.WHITE);
 40             paint.setAntiAlias(true);
 41             paint.setTextSize(14);
 42             if (i == choose) {
 43                 paint.setColor(Color.parseColor("#B8B8B8"));
 44                 paint.setFakeBoldText(true);
 45             }
 46             float xPos = width / 2 - paint.measureText(b[i]) / 2;
 47             float yPos = singleHeight * i + singleHeight;
 48             canvas.drawText(b[i], xPos, yPos, paint);
 49             paint.reset();
 50         }
 51
 52     }
 53
 54     @Override
 55     public boolean dispatchTouchEvent(MotionEvent event) {
 56         final int action = event.getAction();
 57         final float y = event.getY();
 58         final int oldChoose = choose;
 59         final OnTouchingLetterChangedListener listener = onTouchingLetterChangedListener;
 60         final int c = (int) (y / getHeight() * b.length);
 61
 62         switch (action) {
 63         case MotionEvent.ACTION_UP:
 64             setBackgroundDrawable(new ColorDrawable(0x00000000));
 65             choose = -1;//
 66             invalidate();
 67             if (mTextDialog != null) {
 68                 mTextDialog.setVisibility(View.INVISIBLE);
 69             }
 70             break;
 71
 72         default:
 73             // setBackgroundResource(R.drawable.sidebar_background);
 74             if (oldChoose != c) {
 75                 if (c >= 0 && c < b.length) {
 76                     if (listener != null) {
 77                         listener.onTouchingLetterChanged(b[c]);
 78                     }
 79                     if (mTextDialog != null) {
 80                         mTextDialog.setText(b[c]);
 81                         mTextDialog.setVisibility(View.VISIBLE);
 82                     }
 83
 84                     choose = c;
 85                     invalidate();
 86                 }
 87             }
 88
 89             break;
 90         }
 91         return true;
 92     }
 93
 94     public void setOnTouchingLetterChangedListener(
 95             OnTouchingLetterChangedListener onTouchingLetterChangedListener) {
 96         this.onTouchingLetterChangedListener = onTouchingLetterChangedListener;
 97     }
 98
 99     public interface OnTouchingLetterChangedListener {
100         void onTouchingLetterChanged(String s);
101     }
102
103 }

接下来是整个布局的部署了activity_sortlist

 1 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     android:id="@+id/layout_main"
 3     android:layout_width="fill_parent"
 4     android:layout_height="fill_parent">
 5
 6     <ListView
 7         android:id="@+id/country_lvcountry"
 8         android:layout_width="fill_parent"
 9         android:layout_height="fill_parent"
10         android:layout_gravity="center"
11         android:divider="#eeeeee"
12         android:dividerHeight="1px" />
13
14     <LinearLayout
15         android:id="@+id/top_layout"
16         android:layout_width="fill_parent"
17         android:layout_height="wrap_content"
18         android:background="#f2f2f2">
19
20         <TextView
21             android:id="@+id/top_char"
22             android:layout_width="wrap_content"
23             android:layout_height="wrap_content"
24             android:paddingBottom="3dip"
25             android:paddingLeft="10dip"
26             android:paddingTop="3dip"
27             android:text=""
28             android:textColor="#333333"
29             android:textSize="14sp" />
30     </LinearLayout>
31
32     <TextView
33         android:id="@+id/dialog"
34         android:layout_width="80dp"
35         android:layout_height="80dp"
36         android:layout_gravity="center"
37         android:background="#999999"
38         android:gravity="center"
39         android:textColor="#ffffffff"
40         android:textSize="30dp"
41         android:visibility="invisible" />
42
43     <com.app.activitys.view.SideBar
44         android:id="@+id/sidrbar"
45         android:layout_width="25.0dip"
46         android:layout_height="fill_parent"
47         android:layout_gravity="right|center"
48         android:layout_marginBottom="10dp"
49         android:layout_marginTop="10dp" />
50
51
52 </FrameLayout>

接下来时使用了Sortlist

@ContentView(R.layout.activity_sortlist)
public class Sortlist extends BaseAppActivity {
private String[] strzimu = {"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 CharacterParser characterParser;
    private PinyinComparator pinyinComparator;
    private List<MyBrandListSortModel> SourceDateList; // 数据
    private BrandSortAdapter adapter; // 排序的适配器
    String   staus="";
    private int lastFirstVisibleItem = -1;
    @ViewInject(R.id.country_lvcountry)
    private ListView sortListView;
    @ViewInject(R.id.sidrbar)
    private SideBar sideBar;
    @ViewInject(R.id.dialog)
    private TextView dialog;
    @ViewInject(R.id.top_layout)
    private LinearLayout xuanfuLayout;
    @ViewInject(R.id.top_char)
    private TextView xuanfaText;
    @Override
    protected void init() {
        characterParser = CharacterParser.getInstance();
        pinyinComparator = new PinyinComparator();
        sideBar.setTextView(dialog);
        SourceDateList = new ArrayList<>();
        SourceDateList = filledData(SourceDateList);
        Collections.sort(SourceDateList, pinyinComparator);//这是设置adapter
        adapter = new BrandSortAdapter(this, SourceDateList);
        sortListView.setAdapter(adapter);
        initEvent();
    }
    @Override
    public void onResume() {
        super.onResume();
        getData();
    }
    private void initEvent() {//listview的监听事件
        sideBar.setOnTouchingLetterChangedListener(new SideBar.OnTouchingLetterChangedListener() {

            @Override
            public void onTouchingLetterChanged(String s) {
                int position = adapter.getPositionForSection(s.charAt(0));
                if (position != -1) {
                    sortListView.setSelection(position);
                }

            }
        });
        sortListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) {
               //这边是点击处理的事件,大家自己随意写啊
            }

        });
        /**
         * 设置滚动监听, 实时跟新悬浮的字母的值
         */
        sortListView.setOnScrollListener(new AbsListView.OnScrollListener() {

            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem,
                                 int visibleItemCount, int totalItemCount) {
//                Log.e("zzzzzzzz", "-----firstVisibleItem--->" + firstVisibleItem);
                int section = adapter.getSectionForPosition(firstVisibleItem);
                int nextSecPosition = -1;
                if (!String.valueOf((char) section).equals(" ")) {
                    for (int i = 1; i < 26; i++) {
                        if (adapter.getPositionForSection(section + i) == -1) {

                        } else {
                            nextSecPosition = adapter.getPositionForSection(section + i);
//                            Log.e("nextSecPosition", "-----nextSecPosition--->"+nextSecPosition );
                            break;
                        }
                        if (i == 25) {
                            nextSecPosition = firstVisibleItem + 1;
//                            Log.e("nextSecPosition2", "-----nextSecPosition2--->"+nextSecPosition );
                        }
                    }
                }

                if ((firstVisibleItem != lastFirstVisibleItem) && adapter.getCount() > 0) {
                    ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) xuanfuLayout
                            .getLayoutParams();
                    params.topMargin = 0;
                    xuanfuLayout.setLayoutParams(params);
                    xuanfaText.setText(String.valueOf((char) section));
                }
                if (nextSecPosition == firstVisibleItem + 1) {
//                    Log.e("nextSecPosition", "-----nextSecPosition--->" );
                    View childView = view.getChildAt(0);
                    if (childView != null) {
                        int titleHeight = xuanfuLayout.getHeight();
                        int bottom = childView.getBottom();
                        ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) xuanfuLayout
                                .getLayoutParams();
                        if (bottom < titleHeight) {
                            float pushedDistance = bottom - titleHeight;
                            params.topMargin = (int) pushedDistance;
                            xuanfuLayout.setLayoutParams(params);
                        } else {
                            if (params.topMargin != 0) {
                                params.topMargin = 0;
                                xuanfuLayout.setLayoutParams(params);
                            }
                        }
                    }
                }
                lastFirstVisibleItem = firstVisibleItem;
            }
        });
    }

    void getData(){//获取数据
            EGRequestParams params=new EGRequestParams();String url="";//这边是接口
            HttpUtil.post(this, url, params, new HttpUtil.Ok() {
                @Override
                public void success(String str) {//通过modle将数据放入SourceDateList中
                    SourceDateList = JSON.parseArray(str, MyBrandListSortModel.class);
                    if (SourceDateList.size() > 0) {
                        SourceDateList = filledData(SourceDateList);
                        Collections.sort(SourceDateList, pinyinComparator);
                    }
                    updataview();
                }
                @Override
                public void complete(String str) {

                }
            });
    }
    private void updataview() {
        adapter = new BrandSortAdapter(this, SourceDateList);
        sortListView.setAdapter(adapter);
        int section = adapter.getSectionForPosition(0);
        ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) xuanfuLayout
                .getLayoutParams();
        params.topMargin = 0;
        xuanfuLayout.setLayoutParams(params);
        xuanfaText.setText(String.valueOf((char) section));
    }
    public class PinyinComparator implements Comparator<MyBrandListSortModel> {

        public int compare(MyBrandListSortModel o1, MyBrandListSortModel o2) {
            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());
            }
        }

    }
    /**
     * 填充数据
     *
     * @param date
     * @return
     */
    private List<MyBrandListSortModel> filledData(List<MyBrandListSortModel> date) {
        List<MyBrandListSortModel> mSortList = new ArrayList<MyBrandListSortModel>();
        List<MyBrandListSortModel> mSortListTemp = new ArrayList<MyBrandListSortModel>();
        mSortListTemp = date;
        if (date.size() == 0) {
            return mSortList;
        }
        for (int i = 0; i < date.size(); i++) {
            String pinyin = characterParser.getSelling(date.get(i).getName());
            String sortString = pinyin.substring(0, 1).toUpperCase();
            if (sortString.matches("[A-Z]")) {
                date.get(i).setSortLetters(sortString.toUpperCase());
            } else {
                date.get(i).setSortLetters(" ");
            }
        }
        for (int i = 0; i < 27; i++) {
            MyBrandListSortModel tempmodel = new MyBrandListSortModel();
            for (int j = 0; j < date.size(); j++) {
                Integer current = Integer.valueOf(mSortListTemp.get(j).getSortLetters().charAt(0));
                Integer current2 = Integer.valueOf(strzimu[i].charAt(0));
                if (current == current2) {
                    mSortList.add(date.get(j));
                }
            }
        }

        return mSortList;

    }
}

接下来把Adapter也送上吧!(BrandSortAdapter)

  1 public class BrandSortAdapter extends BaseListAdapter {
  2     private List<MyBrandListSortModel> list = null;
  3     private Context mContext;
  4
  5     public BrandSortAdapter(Context context, List<MyBrandListSortModel> list) {
  6         super(context, list);
  7         this.list=list;
  8         this.mContext=context;
  9     }
 10
 11     public int getCount() {
 12         return this.list.size();
 13     }
 14
 15     public Object getItem(int position) {
 16         return list.get(position);
 17     }
 18
 19     public long getItemId(int position) {
 20         return position;
 21     }
 22
 23     public View getView(final int position, View view, ViewGroup arg2) {
 24         ViewHolder viewHolder = null;
 25         final MyBrandListSortModel mContent = list.get(position);
 26         if (view == null) {
 27             viewHolder = new ViewHolder();
 28             view = LayoutInflater.from(mContext).inflate(R.layout.list_item_mycarbrand, null);
 29             viewHolder.tvTitle = (TextView) view
 30                     .findViewById(R.id.tv_user_item_name);
 31             viewHolder.tvLetter = (TextView) view.findViewById(R.id.catalog);
 32             view.setTag(viewHolder);
 33         } else {
 34             viewHolder = (ViewHolder) view.getTag();
 35         }
 36         int section;
 37         if (list.size()>0){
 38             section = getSectionForPosition(position);
 39         }else{
 40             section = 0;
 41         }
 42         if (position == getPositionForSection(section)) {
 43             viewHolder.tvLetter.setVisibility(View.VISIBLE);
 44             viewHolder.tvLetter.setText(mContent.getSortLetters());
 45         } else {
 46             viewHolder.tvLetter.setVisibility(View.GONE);
 47         }
 48         MyBrandListSortModel model = list.get(position);
 49         String realname="- -";
 50         if (!StringUtils.isEmpty(model.getName())){
 51             realname=model.getName();
 52         }
 53         viewHolder.tvTitle.setText(realname);
 54         // 头像采用imageloader加载
 55
 56         return view;
 57
 58     }
 59
 60     final static class ViewHolder {
 61         TextView tvLetter;
 62         TextView tvTitle;
 63     }
 64
 65     /**
 66      * 得到首字母的ascii值
 67      */
 68     public int getSectionForPosition(int position) {
 69         return  list.size()>0?list.get(position).
 70                     getSortLetters().
 71                     charAt(0):Integer.valueOf(‘ ‘);
 72
 73
 74     }
 75
 76     public int getPositionForSection(int section) {
 77         for (int i = 0; i < getCount(); i++) {
 78             String sortStr = list.get(i).getSortLetters();
 79             char firstChar = sortStr.toUpperCase().charAt(0);
 80             if (firstChar == section) {
 81                 return i;
 82             }
 83         }
 84
 85         return -1;
 86     }
 87
 88     public String getAlpha(String str) {
 89         String sortStr = str.trim().substring(0, 1).toUpperCase();
 90         if (sortStr.matches("[A-Z]")) {
 91             return sortStr;
 92         } else {
 93             return " ";
 94         }
 95     }
 96
 97     public Object[] getSections() {
 98         return null;
 99     }
100 }

modle也送给大家吧!MyBrandListSortModel

 1 public class MyBrandListSortModel extends Entity implements Serializable{
 2
 3     private String id;
 4     private String children;
 5     private String name;
 6     private String parentid;
 7     private String parentids;
 8     private String parentname;
 9     private String type;
10     private String value;
11     private String sortLetters;
12
13     public String getId() {
14         return id;
15     }
16
17     public void setId(String id) {
18         this.id = id;
19     }
20
21     public String getSortLetters() {
22         return sortLetters;
23     }
24
25     public void setSortLetters(String sortLetters) {
26         this.sortLetters = sortLetters;
27     }
28
29     public void setChildren(String children) {
30         this.children = children;
31     }
32     public String getChildren() {
33         return children;
34     }
35
36     public void setName(String name) {
37         this.name = name;
38     }
39
40     public String getName() {
41         return name;
42     }
43
44     public void setParentid(String parentid) {
45         this.parentid = parentid;
46     }
47
48     public String getParentid() {
49         return parentid;
50     }
51
52     public void setParentids(String parentids) {
53         this.parentids = parentids;
54     }
55
56     public String getParentids() {
57         return parentids;
58     }
59
60     public void setParentname(String parentname) {
61         this.parentname = parentname;
62     }
63
64     public String getParentname() {
65         return parentname;
66     }
67
68     public void setType(String type) {
69         this.type = type;
70     }
71
72     public String getType() {
73         return type;
74     }
75
76     public void setValue(String value) {
77         this.value = value;
78     }
79
80     public String getValue() {
81         return value;
82     }
83 }

大家参考吧!

时间: 2024-08-08 12:22:49

列表按照字母排序检索SideBar的相关文章

用ItemDecoration实现按字母排序列表

首先看看实现的效果 可以看出要实现上面效果,有三个步骤: 1.汉字转化为拼音,并且根据首字母排序 2.用ItemDecoration实现字母行的显示 3.自定义实现右侧的按字母导航栏 当然重点讲讲ItemDecoration的实现.都知道RecyclerView本身都没有分割线,需要分割线都是在item中画一条线或者使用ItemDecoration来实现分割线.在RecyclerView中我们可以给每一个item都添加ItemDecoration,所以可以自定义ItemDecoration来实现

联系人列表字母排序索引(三)

也是忙忙碌碌好几天,今天又有时间了,继续这个文章的编写.今天是这篇文章的最后一部分.主要内容包括以下几点: 1.将中文名字转化成拼音,并提取首字母,进行排序. 2.实现分组列表Adapter模板. 3.将列表与索引结合在一起. pinyin4j是一个将中文转化成拼音的高效工具,我的源码中带了这个依赖包.通过这个工具,可以先获取一个中文的拼音. public static String getLetter(String name) { StringBuilder sb = new StringBu

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

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

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

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

[Android分享] 【转帖】Android ListView的A-Z字母排序和过滤搜索功能

感谢eoe社区的分享 最近看关于Android实现ListView的功能问题,一直都是小伙伴们关心探讨的Android开发问题之一,今天看到有关ListView实现A-Z字母排序和过滤搜索功能并且实现汉字转成拼音的功能,转帖来和eoe的小伙伴们一同分享下! Android 有关ListView实现A-Z字母排序和过滤搜索功能并且实现汉字转成拼音的功能 我们知道一般我们对联系人,城市列表等实现A-Z的排序,因为联系人和城市列表我们可以直接从数据库中获取他的汉字拼音,而对于一般的数据,我们怎么实现A

Android 联系人字母排序(仿微信)

现在很多APP只要涉及到联系人的界面,几乎都会采取字母排序以及导航的方式.作为程序猿,这种已经普及的需求还是需要学习的,于是小生开始了在网上默默的学习之路,网上学习的资料质量参差不齐,不过也有很不错的文章,文章后面分享给大家.这篇文章,仅是小生在学习之后,自己独立编写与总结吧.废话不多说先上效果图. 从界面上看,整个实现效果有两个重点: 实现字母分类. 实现右侧的字母导航. 我们先一个一个来了解解决方案,再上代码. 实现字母分类: 字母分类又分为三个小要点:一个是将中文转化为拼音,一个是实现按照

利用MySQL数据库来处理中英文取首字母排序

很久都没有写博客了, 但是也积攒了了很多的问题, 下次找个时间一起整理一下, 然后记录下来, 以备不时之需. 我们的联系人列表经常会有按照首字母排序的需求.  这个很方便, 很清晰, 如果不说性能如何, 就像让数据库来做呢? 其实MySQL是支持的. 我们建立一个函数: DELIMITER $$ CREATE FUNCTION `fristPinyin`(P_NAME VARCHAR(255)) RETURNS varchar(255) CHARSET utf8 DETERMINISTIC BE

数据库笔记6:检索,排序检索,过滤数据

insert into products(prod_id,prod_name,pro_price)values('avno1','.5 ton anvil',5.99);insert into products(prod_id,prod_name,pro_price)values('avno2','1 ton anvil',9.99);insert into products(prod_id,prod_name,pro_price)values('avno3','2 ton anvil',14.

网络获取数组信息,根据姓名按首字母排序 添加侧滑删除。

package jianlemeistaff.app.jlm.com.jianlemeistaff.activity; import android.app.Activity; import android.content.Intent; import android.graphics.Color; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.view.Gravi