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