List回调刷新并保持滑动位置

场景:在listview界面滑动到某个位置是,点击跳转界面---------返回需要刷新listview数据,简单的Adapter.notifyDataSetChanged();无法满足刷新要求

需要重写获取数据来刷新。


代码如下:

private int scrollPos, scrollTop;// list滑动位置

route_list.setOnScrollListener(new OnScrollListener() {

			@Override
			public void onScrollStateChanged(AbsListView view, int scrollState) {
				// 不滚动时保存当前滚动到的位置
				if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
					// ListPos记录当前可见的List顶端的一行的位置
					scrollPos = route_list.getFirstVisiblePosition();
				}
				View v = route_list.getChildAt(0);
				scrollTop = (v == null) ? 0 : v.getTop();


			}

			@Override
			public void onScroll(AbsListView view, int firstVisibleItem,
					int visibleItemCount, int totalItemCount) {
				// 滚动时调用

			}
		});

在刷新完成的地方执行下面代码,listview滑动到上次显示的位置

route_list.setSelectionFromTop(scrollPos,scrollTop);



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Android中,AIDL(Android Interface Definition Language)是一种用于进程间通信的接口定义语言。当客户端与服务端跨进程通信时,AIDL可以用来定义服务接口和传输数据类型。对于回调列表,我们可以通过AIDL将客户端的回调接口传递给服务端,在服务端需要回调时,调用客户端的回调接口。 具体实现步骤如下: 1. 首先,在AIDL文件中定义回调接口。例如: ``` // ICallbackInterface.aidl interface ICallbackInterface { void onCallback(int value); } ``` 2. 在服务端的AIDL接口中添加一个注册回调的方法和一个注销回调的方法。例如: ``` // IMyService.aidl interface IMyService { void registerCallback(in ICallbackInterface callback); void unregisterCallback(in ICallbackInterface callback); } ``` 3. 在服务端实现AIDL接口,并在需要回调时调用客户端的回调接口。例如: ``` // MyService.java public class MyService extends Service { private List<ICallbackInterface> mCallbacks = new ArrayList<>(); private void onValueChanged(int value) { for (ICallbackInterface callback : mCallbacks) { try { callback.onCallback(value); } catch (RemoteException e) { // 处理异常 } } } private final IMyService.Stub mBinder = new IMyService.Stub() { @Override public void registerCallback(ICallbackInterface callback) throws RemoteException { mCallbacks.add(callback); } @Override public void unregisterCallback(ICallbackInterface callback) throws RemoteException { mCallbacks.remove(callback); } }; } ``` 4. 在客户端实现回调接口,并在需要时注册回调。例如: ``` // MainActivity.java public class MainActivity extends AppCompatActivity { private IMyService mService; private ICallbackInterface mCallback = new ICallbackInterface.Stub() { @Override public void onCallback(int value) throws RemoteException { // 处理回调值 } }; private ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { mService = IMyService.Stub.asInterface(service); try { mService.registerCallback(mCallback); } catch (RemoteException e) { // 处理异常 } } @Override public void onServiceDisconnected(ComponentName name) { mService = null; } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 绑定服务 Intent intent = new Intent(this, MyService.class); bindService(intent, mConnection, Context.BIND_AUTO_CREATE); } @Override protected void onDestroy() { super.onDestroy(); // 注销回调 if (mService != null) { try { mService.unregisterCallback(mCallback); } catch (RemoteException e) { // 处理异常 } } // 解绑服务 unbindService(mConnection); } } ``` 以上就是使用AIDL实现回调列表的基本步骤。需要注意的是,在使用AIDL时,需要注意线程安全问题,以及处理可能出现的异常情况。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值