android listview数据刷新

在快递查询应用中,历史记录列表需要支持同步跟踪、修改和删除等操作。使用setAdapter()方法每次更新数据会导致列表回到顶端,影响用户体验。通过Adapter的notifyDataSetChanged方法可以实现列表位置不变,仅更新数据。需要注意的是,自定义Adapter时数据应为全局或非私有,以便重新设置。在尝试记录并恢复滚动位置后发现,setSelectionFromTop(index, y)方法能更精确地定位,但实现起来存在偏差。最终找到了理想解决方案,并将在新版本中更新。" 44569657,1458269,动手实现第一个Ajax小例子,"['javascript', 'ajax', '方法回调']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

快递查中有一个历史记录的列表,针对这个列表有同步跟踪记录、修改、删除等操作,那就避免不了这对这个列表的数据刷新。

每次重新获得数据后,就setAdapter(),这样,列表就回到了顶端,用户体验极差,理想状态是,列表位置不动,只更新数据。解决方案是利用Adapter的notifyDataSetChanged,通知Adapter数据已经更改,然后Adapter会调用getView()方法,重新显示界面。

注意的一点是如果Adapter是自定义的,那么数据要是全局的或者是在自定义Adapter中不能是私有的,因为要重新设置数据,

 

public class HistoryListViewAdapter extends BaseAdapter {

	private List<QueryRecord> mItemList; 
	private LayoutInflater mInflater;
	private Context mContext;

	public HistoryListViewAdapter(Context c,List<QueryRecord> itemList) {
		mItemList = itemList;
		mContext = c;
		mInflater = (LayoutInflater) mContext
				.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
	}

	public void setItemList(List list) {
		mItemList = list;
	}

	@Override
	public int getCount() {
		//
	}

	@Override
	public Object getItem(int position) {
		//
	}

	@Override
	public long getItemId(int position) {
		//
	}

	public void removeItem(int position) {
		//
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		//
	}
}

 

再在数据重新获取后

 

listitemAdapter.setItemList(list); //重新设置数据
listitemAdapter.notifyDataSetChanged();

 

这样数据重新刷新,界面刷新。

下面是我走的弯路,因为思维偏了。

一开始我就Google搜索“ListView 滚动 指定位置”,这样整体解决思路是记忆滚动位置,恢复位置,而是有了下面的解决方法:

监听ListView的OnScrollListener

 

lvHistory.setOnScrollListener(listHistoryScroll);

 

在onScrollStateChanged中通过getFirstVisiblePosition获取当前可见ListView顶端一行的位置

 

public int listHistoryPos = 0; //listHistoryPos记录当前可见的List顶端一行的位置

 

 

private OnScrollListener listHistoryScroll = new OnScrollListener() {

	@Override
	public void onScrollStateChanged(AbsListView view, int scrollState) {
		//scrollState有三种状态,分别是开始滚动(SCROLL_STATE_FLING),正在滚动(SCROLL_STATE_TOUCH_SCROLL ), 已经停止(SCROLL_STATE_IDLE )
		if(scrollState == OnScrollListener.SCROLL_STATE_IDLE){
			listHistoryPos = lvHistory.getFirstVisiblePosition();
		}
	}

	@Override
	public void onScroll(AbsListView arg0, int arg1, int arg2, int arg3) {
		// TODO Auto-generated method stub

	}
};

 

数据重新绑定后通过ListView的setSelection()方法,设回原位

 

lvHistory.setSelection(listHistoryPos);

 

这样虽然比每次重回顶端好,但用户体验还不理想,因为不可能要求用户每次都拖动得那么准确。

后来发现ListView还有一个方法是setSelectionFromTop(index,y),而是开始想尽各种方法记录y的值,都不理想,大部分时候都有偏差。setSelection(index)效果等于setSelectionFromTop(index,0),也就是上面为什么说不可能每次拖动都那么准确。

最终还真有“伊人在灯火阑珊处”的感觉。该修正将在快递查2.4版本中更新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安卓学习乐园

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值