主要是要使用runOnUiThread,在主线程中才能获取屏幕的实例
在解决这个问题前,我假设是我的代码写得过于复杂,写了很多个函数。
搞得看不清问题所在,于是我把函数中的逻辑代码替换掉函数调用。代码逻辑清晰很多。
找到了获取实例所在位置的方法,但是位置函数总是返回-1.于是想着加了一个runOnUiThread函数,没想到成功了,
我猜测是因为在子线程中无法获取到屏幕的实例。后来在找有无获取屏幕中出现的第一行和最后一行实例的api,确实也找到了。靠着这个逻辑也优化了自动滚动的代码。
ScheduledExecutorService executorService = newSingleThreadScheduledExecutor(); // 使用线程池(阿里插件提示提示)
executorService.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
LinearLayoutManager linearLayoutManager = (LinearLayoutManager) layoutManager;
int firstItemPosition = linearLayoutManager.findFirstCompletelyVisibleItemPosition();
int lastItemPosition = linearLayoutManager.findLastVisibleItemPosition();
View firstView = linearLayoutManager.findViewByPosition(firstItemPosition);
View lastView = linearLayoutManager.findViewByPosition(lastItemPosition);
TextView firstItem = firstView.findViewById(R.id.tx_messageItem);
TextView lastItem = lastView.findViewById(R.id.tx_messageItem);
Log.d("textview", "firstItem " + firstItem.getText().toString());
Log.d("textview", "lastItem " + lastItem.getText().toString());
if (lastItemPosition != linearLayoutManager.getItemCount() - 1) {
// 还不是最后一行,把下一行显示出来
recyclerMessage.smoothScrollToPosition(lastItemPosition + 1);
} else {
recyclerMessage.smoothScrollToPosition(FIRST_MESSAGE_POSITION);
}
}
});
}
本文介绍了在Android开发中,由于UI操作必须在主线程进行,因此使用runOnUiThread来确保获取屏幕实例的正确性。通过调整代码逻辑,作者解决了在子线程无法获取屏幕实例的问题,并实现了自动滚动功能的优化,利用LinearLayoutManager找到第一行和最后一行视图,从而实现更智能的滚动效果。
5961

被折叠的 条评论
为什么被折叠?



