首页 > 解决方案 > 如何找出数据集中的某个项目(ArrayList) 当前在屏幕上 (RecyclerView)?

问题描述

这是问题所在:我有一个 dataset: ArrayList<Alarm> alarms, RecyclerView 使用它来显示行。如何确定数据集中的某个项目当前是否在屏幕上?就像是

boolean bl = recyclerView.isItemOnScreenNow(alarms.get(index));

我知道有一种方法((LinearLayoutManager)recyclerView.getLayoutManager()).findFirstVisibleItemPosition(); ,但据我所知,它返回 LayoutManager 中的位置,而不是数据集中项目的位置。那么有没有办法找出数据集中的某个成员当前是否在屏幕上?感谢你们!

标签: androidandroid-layoutarraylistandroid-recyclerviewandroid-adapter

解决方案


可以这样做:

         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);
                }
   

            }
        };

推荐阅读