ListView用法小结

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




待续。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值