问题描述
问题在于:我有一个数据集:ArrayList<Alarm> alarms
,RecyclerView 使用它来显示行。如何确定数据集中的某个项目当前是否在屏幕上?东西,比如
boolean bl = recyclerView.isItemOnScreenNow(alarms.get(index));
我知道有一个方法((linearlayoutmanager)recyclerView.getLayoutManager()).findFirstVisibleItemPosition();
但据我所知,它返回 LayoutManager 中的位置,而不是数据集中项目的位置。那么有没有办法找出数据集中的某个成员当前是否在屏幕上?
谢谢各位!
解决方法
可以这样做:
BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context,Intent intent) {
int indexToDelete = Integer.MAX_VALUE;
int idToDelete = intent.getIntExtra("Time to delete",0);
int idToDeleteOnScreen = Integer.MAX_VALUE;
for(Iterator<Alarm> iterator = alarms.iterator(); iterator.hasNext();){
Alarm alarm = iterator.next();
if(alarm.getId() == idToDelete){
indexToDelete = alarms.indexOf(alarm);
break;
}
}
int index = 0;
View view;
while((view = recyclerView.getChildAt(index)) != null){
DisturberAdapter.AlarmHolder alarmHolder = (DisturberAdapter.AlarmHolder) recyclerView.getChildViewHolder(view);
int itemOnScreenId = alarmHolder.getId();
if(idToDelete == itemOnScreenId){
idToDeleteOnScreen = index;
Log.d("Dnd expireReceiver","found! "+index);
break;
}
index++;
}
if(view == null){
//If the item isn't on the screen,no need for animation,just delete
alarms.remove(indexToDelete);
recyclerView.getAdapter().notifyDataSetChanged();
}else{
//If the view is on the screen start animation
animationRecyclerViewItemExpired(idToDeleteOnScreen,indexToDelete);
}
}
};