使用HorizontalListView完成一个可拉动刷新的横向listview并且初始可以定位的
2015-01-18 11:00
651 查看
本人纯菜鸟 因项目所需需要横向的listview 然后可以右拉加载下一页的数据,在网上找了3天,就http://blog.csdn.net/yanzi1225627/article/details/21294553#reply,这个给了不少启发,感谢大神的贡献。
,大家下代码看看 应该也能看懂
跟着大神玩 ---------------------------------本文系原创,转载请注明作者:yunuoqzone19
最后给出demo的地址:demo 地址
1、首先是初始定位到 最后的item ,由于HorizontalListView没有实现setSelection方法,并且在网上看了一些人写的说实现了这个方法的帖子都发现木有效果,只要使用scrollTo方法,来定位,于是乎只要计算屏幕的大小,以及每一个item的宽度,然后设置需要移动到什么位置,具体的 在随后的demo中会给出代码,供大家参考。
<span style="white-space:pre"> </span>DisplayMetrics metric = new DisplayMetrics(); ((Activity) context).getWindowManager().getDefaultDisplay() .getMetrics(metric); int width_phone = metric.widthPixels; // 获取到屏幕宽度(像素) int wid = Tool.px2dip(context, Integer.valueOf(width_phone));//将px 转化为dp来使用 RelativeLayout.LayoutParams laypar1 = (android.widget.RelativeLayout.LayoutParams)
attendac_mangag_horizon_listlayout.getLayoutParams();//获取HorizontalListView外部的RelativeLayout 因为有可能不会整除,就动态增加距离左边的长度 int yu = (wid - 82) % 7; laypar1.leftMargin = Tool.dip2px(context, (50 + yu));//视图中设置的初始距离左边长度为50dp 再加上余数就可以保证HorizontalListView的长度可以被7整除,这一点蛮重要的,不然可能会导致移动的位置过少或者过多的情况 attendac_mangag_horizon_listlayout.setLayoutParams(laypar1); pian = ((wid - 82) / 7);//获取到了每一个item的宽度 int widd = pian - 20;//为什么要剪掉20呢 因为原先设置的 柱状图的宽度为20dp 所以剪掉了 后边有使用到 具体看代码 horizon_listview.scrollTo(Tool.dip2px(context, pian * 25));//设置了移动的长度
2.然后就是右拉刷新的,因为这个HorizontalListView不是一个传统的listview ,并不是很好实现所以addFooterView()、setOnScrollListener()、removeFooterView()这些东西,无奈之下只要整了一个蛮戳的办法来实现,思路是对监听滑动的位置,如果滑动的0 的时候就进行刷新的操作,然后当刷新操作完成之后在将其滑动到 1 的位置
//监听一下移动的位置咯 不加延时 会挂掉也不知道是为什么 知道的同学请告知下
horizon_listview.setOnScrollStateChangedListener(new OnScrollStateChangedListener() { @Override public void onScrollStateChanged(ScrollState scrollState) { // TODO Auto-generated method stub if (horizon_listview.getFirstVisiblePosition() == 1) { if (!cc) { Handler handler11 = new Handler(); handler11.postDelayed(new Runnable() { @Override public void run() { // setHideAnimation(login_linear_img, // 0); horizon_listview.scrollTo(Tool.dip2px( context, pian * 2));//控制一下位置 看代码就知道为什么是要移动2个宽度啦 } }, 300); } } else if (horizon_listview.getFirstVisiblePosition() == 0) { // Toast.makeText(context, "加载中请稍后···", // Toast.LENGTH_SHORT).show(); if (!cc) { Handler handler11 = new Handler(); handler11.postDelayed(new Runnable() { @Override public void run() { // setHideAnimation(login_linear_img, // 0); horizon_listview.scrollTo(Tool.dip2px( context, pian * 1)); } }, 300); } } else { cc = false; } } });
3、点击后状态的变化,对点击之后 在对应的item下 出现 “处理中” 的字样,点其他的前一个的字样消失。这个地方搞的还是蛮蛋疼的,直接在adapter里边修改item还改不了,必须要刷新列表, 无语了。 有同学能优化下 求告知。
首先在mainactivity中进行监听 点击事件啦// horizon_listview.setSelection(23); horizon_listview.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // TODO Auto-generated method stub adpter.setSelectpostion(position); } });点击事件的方法,代码也懒得在里边写什么注释了 ,找妹子去打lol 了
,大家下代码看看 应该也能看懂
public void setSelectpostion(int position) { // Log.i("ssss", "position= " + position); // Log.i("ssss", "selectIndex= " + selectIndex); // 获取当前view 的id 然后和上一次保存下来的textview 的id做对比 如果不一样则上一个隐藏 TextView test = textsave.get(position); test.setText("处理中"); // Log.i("ssss", "上一次的textviewsave ="+textviewsave); if(textviewsave!=null){ if (selectIndex == position) { } else { textviewsave.setText(""); } } notifyDataSetChanged(); selectIndex = position; textviewsave = textsave.get(position); Log.i("ssss", "保存下的textviewsave ="+textviewsave); }
跟着大神玩 ---------------------------------本文系原创,转载请注明作者:yunuoqzone19
最后给出demo的地址:demo 地址
相关文章推荐
- 轮播图,并且在轮播图下用listview显示,填充listView让他全屏显示,可以使用PullToRefreshScrollView上下刷新,加载
- Python web框架Django学习(1)——在win7 64bit下配置开发环境Django:一个可以使Web开发工作愉快并且高效的Web开发框架。 使用Django,使你能够以最小的代价构建和
- 请写一个简单的幻灯效果页面。如果不使用JS来完成,可以加分。
- 使用my97对区间日期进行操作的时候,后一个时间必须大于前一个时间,并且不可以超过当前的时间
- 请写一个简单的幻灯效果页面。如果不使用JS来完成,可以加分。
- 使用layer的alert函数完成根据post请求结果弹出一个提示,然后刷新本页面
- 请写一个简单的幻灯效果页面。如果不使用JS来完成,可以加分。
- 找了几天终于找到一个无限联动下拉框的代码,并且可以赋初始值,非常满意
- 怎么给网页写一个侧栏(横向两列布局-使用绝对定位和相对定位的方法)
- 一个使用GridView显示数据,并且可以进行添加、修改、删除操作的例子
- 完成一个学生管理程序,使用学号作为键添加5个学生对象,并可以将全部信息保存在文件中,可以实现对学生信息的学号查找,输出全部学生信息的功能。
- 请写一个简单的幻灯效果页面。如果不使用JS来完成,可以加分。
- 使用API实现的一个增加系统桌面,并且可以任意切换的小程序.
- 请写一个简单的幻灯效果页面。如果不使用JS来完成,可以加分。
- 在一个fragment中给SQlite数据库insert数据,如何在另一个fragment中query到ListView并且即时刷新
- 创建一个popupwindow,在里面放置一个listview,并且使listview可以响应点击事件
- 请写一个简单的幻灯效果页面。如果不使用JS来完成,可以加分。
- 请写一个简单的幻灯效果页面。如果不使用JS来完成,可以加分。
- 【JavaMail】(2)JavaMail的一个案例:用户在网站上注册完成后给用户发一封邮件, 且需要用户通过邮件激活后才可以使用。
- 一个可以使用checkbox,radiobutton的Listview的源码