您的位置:首页 > 其它

使用HorizontalListView完成一个可拉动刷新的横向listview并且初始可以定位的

2015-01-18 11:00 651 查看
本人纯菜鸟 因项目所需需要横向的listview 然后可以右拉加载下一页的数据,在网上找了3天,就http://blog.csdn.net/yanzi1225627/article/details/21294553#reply,这个给了不少启发,感谢大神的贡献。


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 地址
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐