现在的位置: 首页 > 综合 > 正文

笔记69–继续ListView2

2018年07月12日 ⁄ 综合 ⁄ 共 4118字 ⁄ 字号 评论关闭

ctrl+shift+O引入所用到的包,特别好使。

一、ListView的下拉刷新

贴大神链接:http://blog.csdn.net/guolin_blog/article/details/9255575

上代码:http://download.csdn.net/detail/mwj_88/7764499

用法:1)在Activity的布局文件中加入自定义的RefreshableView,并让ListView包含其中。

2)在Activity中调用RefreshableView的setOnRefreshListener方法注册回调接口。

3)在onRefresh方法的最后,记得调用RefreshableView的finishRefreshing方法,通知刷新结束。

二、ListView长按事件的两种写法(弹出上下文菜单)

1、setOnItemLongClickListener

lv.setOnItemLongClickListener(new OnItemLongClickListener() {

	@Override
	public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
		int arg2, long arg3) {
		System.out.println("11111111");
		Toast.makeText(getBaseContext(), "111", Toast.LENGTH_SHORT).show();
		System.out.println("-------");
		return false;
	}
});

2、setOnCreateContextMenuListener。分两步实现,先注册上下文菜单事件,然后响应上下文菜单的点击事件。

lv.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {

	@Override
	public void onCreateContextMenu(ContextMenu menu, View v,
			ContextMenuInfo menuInfo) {
		System.out.println("222222");
		menu.add(0, 0, 0, "添加");
		menu.add(0, 1, 0, "删除");
		menu.add(0, 2, 0, "删除所有");
	}

});

定义一个新的函数来响应上下文菜单的点击事件

public boolean onContextItemSelected(MenuItem item){
		
	switch (item.getItemId()) {
	case 0:
		Toast.makeText(getApplicationContext(), "添加", 1).show();
		break;

	case 1:
		Toast.makeText(getApplicationContext(), "删除", 1).show();
		break;
			
	default:
		break;
	}
	return super.onContextItemSelected(item);
}

说明:长按事件和创建上下文菜单事件可共存,执行顺序有先后。先执行setOnItemLongClickListener,后执行setOnCreateContextMenuListener。

三、ListView的getChildAt()介绍

lv.setOnItemClickListener(new OnItemClickListener() {

	@Override
	public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
			long arg3) {
		System.out.println("----------"+arg2);
		
		TextView tv=(TextView) arg0.getChildAt(arg2%8).findViewById(R.id.tv1);
		tv.setText("aaaaaaaaaaa");
	}
});

还得说listview的原理,它只会保存当前屏幕能显示的item,超过的就会销毁。所以调用getChildAt(int),如果输入的int值大于当前屏幕能显示的item值,那么就会报空指针错误。

lv.getChildAt()和arg0.getChildAt():arg0.getChildAt()在界面上能显示的item数量比lv.getChildAt()在界面上能显示的item数量多1。即假设用lv.getChildAt()时,屏幕能显示8个item,那么lv.getChildAt(9)就报错;那么用arg0.getChildAt(9)就不会报错,而是arg0.getChildAt(10)时报错。

四、ListView上拉加载

说下实现原理:

给listview加一个footerView,当滑动到footerView时,就继续加载下一页数据,当所有数据加载完了,就移除footerView。

实现步骤:1、给listview添加footerView。2、让listview实现setOnScrollListener事件,用来记录当前滚动到的位置;当该位置为footerView的位置时,若有下一页就继续加载下一页。3、所有数据加载完成后,删除footerView,将下一页的标识设为false。

知识补充:listview数据变更时,需调用adapter.notifyDataSetChanged();若数据为空,则不能调用adapter.notifyDataSetChanged()。

注意事项:1、lv.addFooterView()要在setAdapter之前添加,否则会不显示。2、当前滚动到的位置:listItem=firstVisibleItem+visibleItemCount-1;

代码:

int lastVisibleIndex;
boolean bHaveMore=false;
lv.addFooterView(moreView); //添加底部view,一定要在setAdapter之前添加,否则会报错。
lv.setOnScrollListener(new OnScrollListener() {

	@Override
	public void onScrollStateChanged(AbsListView view, int scrollState) {
		if (scrollState == OnScrollListener.SCROLL_STATE_IDLE && lastVisibleIndex == lv.getCount()) {
			if(bHaveMore){
				//加载数据
				getData();
			}
		}
	}

	@Override
	public void onScroll(AbsListView view, int firstVisibleItem,
			int visibleItemCount, int totalItemCount) {
		//减1是因为上面加了个addFooterView
		lastVisibleIndex = firstVisibleItem + visibleItemCount-1;
	}
});

private void getData(){
	new Thread(){
		public void run() {
			try{
				//解析数据存放到data中
<span style="white-space:pre">	</span>			dataList.addAll(data);
				//如果data大小为0,说明没有更多数据了,移除footerview,并设标志为false
				if(data.size()==0){
					bHaveMore=false;
					runOnUiThread(new Runnable() {
						@Override
						public void run() {
							order_lv.removeFooterView(moreView);
							//如果没有数据,就不调用notifyDataSetChanged,否则报错
							if(dataList.size()!=0){
								adapter.notifyDataSetChanged();
							}
						}
					});
					return;
				}

				msg.what=GET_DATA_SUCCESS;
				handler.sendMessage(msg);

			}catch(Exception e){
				msg.what=GET_DATA_FAILURE;
				handler.sendMessage(msg);
			}
		}
	}.start();
}
五、二级联动ListView

不知道为何他们这么叼,还重写控件了。用原生的ListView也可以实现的哇。

1、布局文件中画两个ListView

2、代码实现:

lv1.setOnItemClickListener(new OnItemClickListener() {

	@Override
	public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
			long arg3) {
		l=city.get(arg2);
		Toast.makeText(getApplicationContext(), "aaaaa"+l.size(), 1).show();
		adapter2=new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, l);
		lv2.setAdapter(adapter2);
	//	adapter2.notifyDataSetChanged();这个为什么没作用???
	}
});
		
lv2.setOnItemClickListener(new OnItemClickListener() {

	@Override
	public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
			long arg3) {
		Toast.makeText(getApplicationContext(), l.get(arg2), 1).show();
	}			
});

抱歉!评论已关闭.