如何找出数据集 (ArrayList<obj>) 中的某个项目当前是否在屏幕 (RecyclerView) 上?
How to find out if a certain item from the dataset (ArrayList<obj>) is currently on the screen (RecyclerView)?
问题出在这里:我有一个数据集:ArrayList<Alarm> alarms
,RecyclerView 使用它来显示行。如何确定数据集中的某个项目当前是否在屏幕上?一些东西,比如
boolean bl = recyclerView.isItemOnScreenNow(alarms.get(index));
我知道有一个方法((LinearLayoutManager)recyclerView.getLayoutManager()).findFirstVisibleItemPosition();
但据我所知 returns 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);
}
}
};
问题出在这里:我有一个数据集:ArrayList<Alarm> alarms
,RecyclerView 使用它来显示行。如何确定数据集中的某个项目当前是否在屏幕上?一些东西,比如
boolean bl = recyclerView.isItemOnScreenNow(alarms.get(index));
我知道有一个方法((LinearLayoutManager)recyclerView.getLayoutManager()).findFirstVisibleItemPosition();
但据我所知 returns 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);
}
}
};