您的位置:首页 > 移动开发 > Android开发

Android项目技术总结:主界面中ListView装载数据并结合手势进行翻页

2012-02-28 13:42 531 查看
该项目中的数据通过ListView来呈现,并且通过手势可以进行翻页。具体步骤:

一、自定义ListView,增加手势;

二、自定义Adapter,固定每页显示的条目数量;

三、编写业务逻辑





通过一个Demo来观察具体的实现:

一、自定义ListView

1、首先定义两个接口,一个向前翻页,一个向后翻页:

public interface OnPrevPageListener {
void onPrevPage();
}

public interface OnNextPageListener {
void onNextPage();
}


2、新建IListView类,继承ListView,并注册这两个接口:

public void setPervPageListener(OnPrevPageListener pervPageListener) {
this.pervPageListener = pervPageListener;
}

public void setNextPageListener(OnNextPageListener nextPageListener) {
this.nextPageListener = nextPageListener;
}

3、重写performItemClick和onTouchEvent方法,确定手势的轨迹:

@Override
public boolean performItemClick(View view, int position, long id) {
int m=mTouchSize;
mTouchSize=0;
if(m > MAXTouchSize){
return true;
}else{
return super.performItemClick(view, position, id);
}
}

@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_MOVE && event.getHistorySize() > mTouchSize) {
mTouchSize = event.getHistorySize();
}
mDetector.onTouchEvent(event);
return super.onTouchEvent(event);
}


4、增加手势:

private class IGestureListener extends SimpleOnGestureListener{
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {
if (e1.getX() - e2.getX() > verticalMinDistance && Math.abs(velocityX) > minVelocity) {
if(nextPageListener!=null){
nextPageListener.onNextPage();
IListView.this.startAnimation(nextanim);
}
} else if (e2.getX() - e1.getX() > verticalMinDistance && Math.abs(velocityX) > minVelocity) {
if(pervPageListener!=null){
pervPageListener.onPrevPage();
IListView.this.startAnimation(pervanim);
}
}
return false;
}
}


二、自定义Adapter

因为Demo对数据没什么监听要求,所以Adapter很简单,只是规定了每个页面返回的记录条数。

static int pageCount = 10;
@Override
public int getCount() {
// TODO Auto-generated method stub
return pageCount;			//备注4
}

其中的生成view的方法:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = (LinearLayout) inflater.inflate(layoutId, null);
TextView listid = (TextView)convertView.findViewById(ids[0]);
listid.setText(data.get(position+(FlipListDemo.pageid-1)*pageCount).get(strs[0]).toString());	//备注3
TextView listvalue = (TextView)convertView.findViewById(ids[1]);
listvalue.setText(data.get(position+(FlipListDemo.pageid-1)*pageCount).get(strs[1]).toString());
return convertView;
}


三、业务逻辑的实现

iList.setPervPageListener(new OnPrevPageListener() {

public void onPrevPage() {
if(pageid>1){
pageid--;
initData();
}
}
});

iList.setNextPageListener(new OnNextPageListener() {

public void onNextPage() {
if(pageid<10){
pageid++;			//备注1
initData();
}
}
});


其中数据加载方法initData():

private void initData() {
for (int i = (pageid-1)*10; i < pageid*10; i++) {		//备注2
HashMap<String,String> map = new HashMap<String,String>();
map.put("id", i+"");
map.put("value", "i want "+i);
list.add(map);
}
page.setText(pageid+"");
adapter.notifyDataSetChanged();
}


可以看出业务逻辑实现的顺序:

1、备注1,当我们要翻到下一页,这里的pageid便会加1,。

2、备注2,因为pageid自加了1,于是这里的for循环得到的数据变为10-19,为第二页的数据。

3、备注3,因为备注2的方法中的adapter更新,于是这里的一些值将会被重新赋新值,即相应的页面对应的条数。

4、备注4,当备注3的值赋好后,这里规定生成10条记录。

至此,新的一页便产生了,往前是一样的逻辑。

最后奉上Demo代码:http://download.csdn.net/detail/duancanmeng/4096458
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐