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(); } });