Android头部悬浮ListView第二种实现方式
来源:互联网 发布:mac pro桌面壁纸 高清 编辑:程序博客网 时间:2024/05/16 10:57
上篇博客,根据几位大神的博客总结出了一篇ListView悬浮,快速索引。效果非常不错,而且易于扩展,可在实际项目中并不是很通用,因为总需要实现SectionIndexer接口,比较复杂而且不是所有的分且头部都是由A-Z 这种分组,也可能是以任意条件的分组,比如时间。这种情况下上一篇的方法就不能用了。本篇则是基于上一篇的代码修改,使的ListView不再去实现SectionIndexer.修改OnScrollListener中的监听,使得可悬浮ListView能够基本通用。
效果与上篇完全一样。
代码如下:
1.adapter代码
/** * @description 通用Adapter* @author rzq* @date 2015*/public class SortAdapter extends BaseAdapter{ private List<SortModel> list = null; private Context mContext; private SortModel country; private ViewHolder holder1, holder2; public SortAdapter(Context mContext, List<SortModel> list) { this.mContext = mContext; this.list = list; } @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { country = (SortModel) list.get(position); int type = getItemViewType(position); if (convertView == null) { switch (type) { case 0: holder1 = new ViewHolder(); convertView = LayoutInflater.from(mContext).inflate(R.layout.item_group, parent, false); holder1.tvTitle = (TextView) convertView.findViewById(R.id.catalog); convertView.setTag(holder1); break; case 1: holder2 = new ViewHolder(); convertView = LayoutInflater.from(mContext).inflate(R.layout.item, parent, false); holder2.tvTitle = (TextView) convertView.findViewById(R.id.title); convertView.setTag(holder2); break; } } else { switch (type) { case 0: holder1 = (ViewHolder) convertView.getTag(); break; case 1: holder2 = (ViewHolder) convertView.getTag(); break; } } switch (type) { case 0: holder1.tvTitle.setText(country.getSortLetters()); break; case 1: holder2.tvTitle.setText(country.getName()); break; } return convertView; } @Override public int getItemViewType(int position) { country = (SortModel) getItem(position); if (country.isGroup()) { return 0; } else { return 1; } } @Override public int getViewTypeCount() { return 2; } final static class ViewHolder { TextView tvTitle; }}
上述代码是一个最普通的多布局Adapter写法,无需实现SectionIndex.
2.Activity代码:
public class MainActivity extends Activity{ private ListView sortListView; private SortAdapter adapter; private CharacterParser characterParser; private List<SortModel> SourceDateList; private PinyinComparator pinyinComparator; private LinearLayout titleLayout; private TextView title; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initViews(); } private void initViews() { titleLayout = (LinearLayout) findViewById(R.id.title_layout); title = (TextView) findViewById(R.id.title); characterParser = CharacterParser.getInstance(); pinyinComparator = new PinyinComparator(); sortListView = (ListView) findViewById(R.id.country_lvcountry); SourceDateList = filledData(getResources().getStringArray(R.array.date)); Collections.sort(SourceDateList, pinyinComparator); adapter = new SortAdapter(this, SourceDateList); sortListView.setAdapter(adapter); sortListView.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } /** * AbsListView滑动时执行 */ @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { /** * 取出列表相临两项 */ SortModel modelFirst = (SortModel) adapter.getItem(firstVisibleItem); SortModel modelSecond = (SortModel) adapter.getItem(firstVisibleItem + 1); if (firstVisibleItem != lastFirstVisibleItem) { MarginLayoutParams params = (MarginLayoutParams) titleLayout.getLayoutParams(); params.topMargin = 0; titleLayout.setLayoutParams(params); if (modelFirst.getSortLetters() != null) { title.setText(modelFirst.getSortLetters()); } } /** * 相临两组Data状态不同,且第一组数据的状态为普 通数据,第二组数据为Group,则符合悬浮的条件,开始进行判断部悬浮计算 */ if (modelFirst.isGroup() == false && modelSecond.isGroup() == true) { View childView = view.getChildAt(1); if (childView != null) { int titleHeight = titleLayout.getHeight(); int top = childView.getTop(); MarginLayoutParams params = (MarginLayoutParams) titleLayout.getLayoutParams(); if (top <= titleHeight) { float pushedDistance = -(titleHeight - top); params.topMargin = (int) pushedDistance; titleLayout.setLayoutParams(params); } } } lastFirstVisibleItem = firstVisibleItem; } }); } private int lastFirstVisibleItem = -1; private List<SortModel> filledData(String[] date) { List<SortModel> mSortList = new ArrayList<SortModel>(); for (int i = 0; i < date.length; i++) { SortModel sortModel = new SortModel(); sortModel.setName(date[i]); /** * 添加了Group数据,[A-Z] */ if (date[i].matches("[A-Z]")) { sortModel.setSortLetters(date[i]); sortModel.setGroup(true); } else { String pinyin = characterParser.getSelling(date[i]); String sortString = pinyin.substring(0, 1).toUpperCase(); if (sortString.matches("[A-Z]")) { sortModel.setSortLetters(sortString.toUpperCase()); } else { sortModel.setSortLetters("#"); } sortModel.setGroup(false); } mSortList.add(sortModel); } return mSortList; }}
通过上述代码可以看出,通过这訲方式实现的效果更加的通用,也是在研究了多位大神的博客后,自己有了改进的想法,编码实现了自己的想法。使用这訲不重写ListView的方式,我们还可以结合PullToRefresh做上下拉刷新,而如果你重定义ListView则很难再与其它开源库相结合。这是使用这一方式最大的优势。
DEMO下载
1 0
- Android头部悬浮ListView第二种实现方式
- Android中listview实现头部悬浮
- Android ListView头部悬浮效果
- Android自定义头部悬浮,快速索引ListView
- Android 中ListView悬浮头部效果设置
- Android ListView分类/分组效果 - 第二种实现方式
- Android ListView分类/分组效果 - 第二种实现方式
- Android ListView分类/分组效果 - 第二种实现方式
- Android ListView分类/分组效果 - 第二种实现方式
- Android ListView分类/分组效果 - 第二种实现方式
- Android ListView分类/分组效果 - 第二种实现方式
- Android ListView分类/分组效果 - 第二种实现方式
- ListView悬浮头部展示效果
- Android RecyclerView实现头部悬浮吸顶效果
- Android 简单实现ListView顶部悬浮效果
- Android 简单实现ListView顶部悬浮效果
- Android 简单实现ListView顶部悬浮效果
- Android 简单实现ListView顶部悬浮效果
- Android Handler 作用以及使用
- Android 沉浸式状态栏攻略 让你的状态栏变色吧
- 根据二叉树遍历序列恢复二叉树
- VMware 设置ubuntu12.04 桥接网络
- 设置EBS 报表输出默认类型HTML并在浏览器中打开
- Android头部悬浮ListView第二种实现方式
- 传值和传址
- HDU 4002 Find the maximum (欧拉函数-积性函数的性质(2011年大连赛区网络赛第二题)
- 【小知识点总结】EditText的属性设置
- 郁闷的win8安装tomcat
- HTML各种标签总结
- 自定义的一个分页类
- Json-smart实现JSONObject、JSONString、Beans之间的转换
- Redis集群管理工具Redis-sentinel原理分析