主要是要使用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);
}
}
});
}