1、Adapter的基本写法
public class DemoAdapter extends BaseAdapter {
private Context mContext;
private List<Info> mData;
public DemoAdapter(Context context, List<Info> data) {
super();
this.mContext = context;
this.mData = data;
}
@Override
public int getCount() {
return mData.size();
}
@Override
public Object getItem(int position) {
return mData.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
//convertView复用
if (convertView == null) {
convertView = View.inflate(mContext, R.layout.item_select, null);
//初始化ViewHolder
holder = new ViewHolder();
//控件初始化
holder.icon = (ImageView) convertView.findViewById(R.id.item_select_icon);
holder.name = (TextView) convertView.findViewById(R.id.item_select_name);
//将holder保存到view里
convertView.setTag(holder);
}else{
//从convertView里取出holder,不用再次做findViewById
holder = (ViewHolder) convertView.getTag();
}
//绑定数据
//mData.get(position);
Info data = (Info) getItem(position);
//holder.icon.setImageBitmap(bitmap);
//holder.icon.setImageResource(R.drawable.ic_contact);
holder.icon.setImageDrawable(data.getIcon);
holder.name.setText(data.getName());
return convertView;
}
/**
* 可看做是控件的持有者,用来保存findViewById找到的控件
* 当convertView复用时,不需要再次做findViewById的操作,从而提高效率
*/
static class ViewHolder{
ImageView icon;
TextView name;
}
}
2、ListView实现分页加载
当listview滑动到底部并且底部的最后一条可见条目,加载下一波数据
//监听listview滑动状态的操作
lv.setOnScrollListener(new OnScrollListener() {
//当listview 滚动状态改变的时候调用
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) { //scrollState : listview 的状态
//SCROLL_STATE_FLING : 惯性滑动的状态
//SCROLL_STATE_IDLE : 空闲状态
//SCROLL_STATE_TOUCH_SCROLL : 缓慢滑动的状态
//当listview 是空闲状态的时候判断最后一条可见条目是否是list集合中的最后一条数据,是加载数据,不是不管了
if (scrollState == OnScrollListener.SCROLL_STATE_IDLE ) {
//获取界面可见的最后一个条目
int position = lv .getLastVisiblePosition();
//判断可见条目是否是list集合中的最后一个条目
if (position == list.size()-1) {
//更改查询的起始位置
startIndex+=MAX_NUM ; // MAX_NUM : 表示多少条数据,startIndex :起始位置
//加载下一波数据
filldata();
}
}
}
//当listview 滚动的时候调用
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
}
});
private void filldata() {
new Thread(){//耗时操作,子线程中进行
public void run() {
if (list == null) {
list = blcakNumberDao.queryPartBlackNumber(MAX_NUM , startIndex );
} else{
//addAll : 将一个集合整合到另一个集合
//a(1,2,3) b(4,5,6) a.addAll(b) a(1,2,3,4,5,6)
list.addAll( blcakNumberDao.queryPartBlackNumber(MAX_NUM , startIndex));
}
//获取完数据,设置显示数据
runOnUiThread( new Runnable() {//其实是运行在主线程的,内存封装了handler
public void run() {
if (myadapter == null) {
myadapter = new Myadapter();
lv.setAdapter(myadapter );//设置显示数据界面
} else{
//更新操作
myadapter.notifyDataSetChanged();//更新界面
}
}
});
};
}.start();
}
两个问题
a.加载完下一波数据,上一波数据没了,解决 : 修改子线程中查询的操作
if (list == null) {
list = blcakNumberDao.queryPartBlackNumber(MAX_NUM, startIndex);
}else{
//addAll : 将一个集合整合到另一个集合
//a(1,2,3) b(4,5,6) a.addAll(b) a(1,2,3,4,5,6)
list.addAll(blcakNumberDao.queryPartBlackNumber(MAX_NUM, startIndex));
}
b.加载完下一波数据,发现总是定位到第一页数据显示,解决:修改设置adapter的操作
//获取完数据,设置显示数据
runOnUiThread(new Runnable() {//其实是运行在主线程的,内存封装了handler
public void run() {
if (myadapter == null) {
myadapter = new Myadapter();
lv.setAdapter(myadapter);//设置显示数据界面
}else{
//更新操作
myadapter.notifyDataSetChanged();//更新界面
}
}
});
3、xml
divider: 分隔线
dividerHeight: 分隔线高度
listSelector: 条目点击的选择器, 注意要配置selector
4、获取点击条目和刷新
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//当前条目对应的对象
ProcessInfo item = (ProcessInfo) parent.getItemAtPosition(position);
//刷新ListView
mAdapter.notifyDataSetChanged();
}
5
// 平滑滚动到最底部
mLv.smoothScrollToPosition(mList.size()-1);
待续。。。