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

首先是自定义view sidebar

 /**
* @author J
*一个自定义view 实现a-z的竖直绘制,和监听滑动事件
*/
public class SideBar extends View {
private OnTouchingLetterChangedListener onTouchingLetterChangedListener;
public static String[] b = { "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 int choose = -1;
private Paint paint = new Paint(); private TextView mTextDialog; public void setTextView(TextView mTextDialog) {
this.mTextDialog = mTextDialog;
} public SideBar(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
} public SideBar(Context context, AttributeSet attrs) {
super(context, attrs);
} public SideBar(Context context) {
super(context);
} protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int height = getHeight();
int width = getWidth();
int singleHeight = height / b.length; for (int i = 0; i < b.length; i++) {
paint.setColor(Color.parseColor("#333333"));
// paint.setColor(Color.WHITE);
paint.setAntiAlias(true);
paint.setTextSize(14);
if (i == choose) {
paint.setColor(Color.parseColor("#B8B8B8"));
paint.setFakeBoldText(true);
}
float xPos = width / 2 - paint.measureText(b[i]) / 2;
float yPos = singleHeight * i + singleHeight;
canvas.drawText(b[i], xPos, yPos, paint);
paint.reset();
} } @Override
public boolean dispatchTouchEvent(MotionEvent event) {
final int action = event.getAction();
final float y = event.getY();
final int oldChoose = choose;
final OnTouchingLetterChangedListener listener = onTouchingLetterChangedListener;
final int c = (int) (y / getHeight() * b.length); switch (action) {
case MotionEvent.ACTION_UP:
setBackgroundDrawable(new ColorDrawable(0x00000000));
choose = -1;//
invalidate();
if (mTextDialog != null) {
mTextDialog.setVisibility(View.INVISIBLE);
}
break; default:
// setBackgroundResource(R.drawable.sidebar_background);
if (oldChoose != c) {
if (c >= 0 && c < b.length) {
if (listener != null) {
listener.onTouchingLetterChanged(b[c]);
}
if (mTextDialog != null) {
mTextDialog.setText(b[c]);
mTextDialog.setVisibility(View.VISIBLE);
} choose = c;
invalidate();
}
} break;
}
return true;
} public void setOnTouchingLetterChangedListener(
OnTouchingLetterChangedListener onTouchingLetterChangedListener) {
this.onTouchingLetterChangedListener = onTouchingLetterChangedListener;
} public interface OnTouchingLetterChangedListener {
void onTouchingLetterChanged(String s);
} }

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

 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout_main"
android:layout_width="fill_parent"
android:layout_height="fill_parent"> <ListView
android:id="@+id/country_lvcountry"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center"
android:divider="#eeeeee"
android:dividerHeight="1px" /> <LinearLayout
android:id="@+id/top_layout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#f2f2f2"> <TextView
android:id="@+id/top_char"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingBottom="3dip"
android:paddingLeft="10dip"
android:paddingTop="3dip"
android:text=""
android:textColor="#333333"
android:textSize="14sp" />
</LinearLayout> <TextView
android:id="@+id/dialog"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_gravity="center"
android:background="#999999"
android:gravity="center"
android:textColor="#ffffffff"
android:textSize="30dp"
android:visibility="invisible" /> <com.app.activitys.view.SideBar
android:id="@+id/sidrbar"
android:layout_width="25.0dip"
android:layout_height="fill_parent"
android:layout_gravity="right|center"
android:layout_marginBottom="10dp"
android:layout_marginTop="10dp" /> </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)

 public class BrandSortAdapter extends BaseListAdapter {
private List<MyBrandListSortModel> list = null;
private Context mContext; public BrandSortAdapter(Context context, List<MyBrandListSortModel> list) {
super(context, list);
this.list=list;
this.mContext=context;
} 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 MyBrandListSortModel mContent = list.get(position);
if (view == null) {
viewHolder = new ViewHolder();
view = LayoutInflater.from(mContext).inflate(R.layout.list_item_mycarbrand, null);
viewHolder.tvTitle = (TextView) view
.findViewById(R.id.tv_user_item_name);
viewHolder.tvLetter = (TextView) view.findViewById(R.id.catalog);
view.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) view.getTag();
}
int section;
if (list.size()>0){
section = getSectionForPosition(position);
}else{
section = 0;
}
if (position == getPositionForSection(section)) {
viewHolder.tvLetter.setVisibility(View.VISIBLE);
viewHolder.tvLetter.setText(mContent.getSortLetters());
} else {
viewHolder.tvLetter.setVisibility(View.GONE);
}
MyBrandListSortModel model = list.get(position);
String realname="- -";
if (!StringUtils.isEmpty(model.getName())){
realname=model.getName();
}
viewHolder.tvTitle.setText(realname);
// 头像采用imageloader加载 return view; } final static class ViewHolder {
TextView tvLetter;
TextView tvTitle;
} /**
* 得到首字母的ascii值
*/
public int getSectionForPosition(int position) {
return list.size()>0?list.get(position).
getSortLetters().
charAt(0):Integer.valueOf(' '); } 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;
} public String getAlpha(String str) {
String sortStr = str.trim().substring(0, 1).toUpperCase();
if (sortStr.matches("[A-Z]")) {
return sortStr;
} else {
return " ";
}
} public Object[] getSections() {
return null;
}
}

modle也送给大家吧!MyBrandListSortModel

 public class MyBrandListSortModel extends Entity implements Serializable{

     private String id;
private String children;
private String name;
private String parentid;
private String parentids;
private String parentname;
private String type;
private String value;
private String sortLetters; public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} public String getSortLetters() {
return sortLetters;
} public void setSortLetters(String sortLetters) {
this.sortLetters = sortLetters;
} public void setChildren(String children) {
this.children = children;
}
public String getChildren() {
return children;
} public void setName(String name) {
this.name = name;
} public String getName() {
return name;
} public void setParentid(String parentid) {
this.parentid = parentid;
} public String getParentid() {
return parentid;
} public void setParentids(String parentids) {
this.parentids = parentids;
} public String getParentids() {
return parentids;
} public void setParentname(String parentname) {
this.parentname = parentname;
} public String getParentname() {
return parentname;
} public void setType(String type) {
this.type = type;
} public String getType() {
return type;
} public void setValue(String value) {
this.value = value;
} public String getValue() {
return value;
}
}

大家参考吧!

https://shop61408405.taobao.com/?spm=a1z10.5-c.0.0.cAfZMN&qq-pf-to=pcqq.group

上面链接都是一下技术视频,欢迎大家kan

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

  1. oracle中检索结果汉字首字母排序详解

    今天写需求,要求将结果按照成本中心首字母排序,平且空放在最前面. 进入正题: 1.使用oracle自带的函数: 按照首字母排序:nlssort(xxx,'NLS_SORT=SCHINESE_PINYI ...

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

      感谢eoe社区的分享   最近看关于Android实现ListView的功能问题,一直都是小伙伴们关心探讨的Android开发问题之一,今天看到有关ListView实现A-Z字母排序和过滤搜索功能 ...

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

    转载:http://blog.csdn.net/xiaanming/article/details/12684155 转载请注明出处:http://blog.csdn.net/xiaanming/ar ...

  4. Android 使用ListView的A-Z字母排序功能实现联系人模块

    在上一篇文章其中,主要学习了ListView的A-Z字母排序功能以及依据输入框的输入值改变来过滤搜索结果,假设输入框里面的值为空.更新为原来的列表,否则为过滤数据列表,包含汉字转成拼音的功能.假设你还 ...

  5. 联系人的侧边字母索引ListView 将手机通讯录姓名通过首字母排序。

      package com.lixu.letterlistview; import java.util.ArrayList; import java.util.List; import org.apa ...

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

    现在很多APP只要涉及到联系人的界面,几乎都会采取字母排序以及导航的方式.作为程序猿,这种已经普及的需求还是需要学习的,于是小生开始了在网上默默的学习之路,网上学习的资料质量参差不齐,不过也有很不错的 ...

  7. Python判断列表是否已排序的各种方法及其性能分析

    目录 Python判断列表是否已排序的各种方法及其性能分析 声明 一. 问题提出 二. 代码实现 2.1 guess 2.2 sorted 2.3 for-loop 2.4 all 2.5 numpy ...

  8. Python 字典 列表 嵌套 复杂排序大全

    https://blog.csdn.net/ray_up/article/details/42084863 一: 字典排序 解析: 使用sorted 方法, 排序后的结果为一个元组. 可以字符串排序( ...

  9. 50-python基础-python3-列表-函数sorted() 对列表进行临时排序

    sorted()函数对列表进行临时排序,返回排序后的列表: 区别列表方法sort()原地修改,无返回值. 1-要保留列表元素原来的排列顺序,同时以特定的顺序呈现它们,可使用函数sorted() . 2 ...

随机推荐

  1. Makefile中的“-I”(大写i),“-L”(大写l),“-l”(小写l)

    用gcc编译程序时,可能会用到“-I”(大写i),“-L”(大写l),“-l”(小写l)等参数, “-I”(大写i):表示包含头文件: “-L”(大写l):表示库文件目录: “-l”(小写l):表示链 ...

  2. C#拦截系统消息的方法-Application.AddMessageFilter

    C#拦截系统消息的方法Application.AddMessageFilter Application.AddMessageFilter这个方法可以接收系统发出的消息: 首先定义一个类,继承IMess ...

  3. ES6中Set集合(与java里类似)

    一.引入背景 Set集合是一种无重复元素的列表,开发者们一般不会逐一读取数组中的元素,也不太可能逐一访问Set集合中的每个元素,通常的做法是检测给定的值在某个集合中是否存在 Map集合内含多组键值对, ...

  4. 转载:JS进度条

    转载地址:http://blog.csdn.net/treeClimber/article/details/569974 代码在原基础上稍作改动,如下: <!DOCTYPE HTML PUBLI ...

  5. Angular 学习笔记——ng-repeat 隔行换色

    <!DOCTYPE html> <html lang="en" ng-app="myApp"> <head> <met ...

  6. Unity3D 中脚本执行的先后顺序

    Unity3D本身自带有控制脚本执行先后顺序的方法: Edit ---> Project Settings ---> Script Execution Order  ---> 值越小 ...

  7. mysql常用命令和函数

    一.DROP IF EXISTS DROP FUNCTION IF EXISTS fun;DROP TABLE IF EXISTS table; 二.数据表1.建立表CREATE TABLE test ...

  8. 【转】 IntelliJ IDEA 详细图解最常用的配置 ,适合刚刚用的新人

    本文转载于:https://blog.csdn.net/qq_27093465/article/details/52918873 刚刚使用IntelliJ IDEA 编辑器的时候,会有很多设置,会方便 ...

  9. C#代码用法

    1.new的用法using System;using System.Collections.Generic;using System.Text;namespace yanz{public class ...

  10. 前端性能优化--为什么DOM操作慢? 浅谈DOM的操作以及性能优化问题-重绘重排 为什么要减少DOM操作 为什么要减少操作DOM

    前端性能优化--为什么DOM操作慢?   作为一个前端,不能不考虑性能问题.对于大多数前端来说,性能优化的方法可能包括以下这些: 减少HTTP请求(合并css.js,雪碧图/base64图片) 压缩( ...