当滚动列表时,RecyclerView.getChild(index)显示null(索引搞砸了)

P-R*_*RAD 14 android android-viewholder android-recyclerview

我一直在为我的Android应用程序使用SwipeableRecyclerView来为我的recyclerView启用滑动.RecyclerView包含cardViews列表.

我试图为卡片实现撤消功能,当向左滑动时会被删除(第一次滑动显示撤消,下一次滑动触发器删除)

我正在尝试以下代码(部分工作,我猜)

SwipeableRecyclerViewTouchListener srvTouchListner = new SwipeableRecyclerViewTouchListener(rvTimerList,
            new SwipeableRecyclerViewTouchListener.SwipeListener(){

                @Override
                public boolean canSwipe(int i) {
                    return true;
                }

                @Override
                public void onDismissedBySwipeLeft(RecyclerView recyclerView, int[] ints) {
                    for(int position : ints){
                        View view = recyclerView.getChildAt(position);
                            if (view.getTag(R.string.card_undo) == null) {
                                if(viewStack == null) {
                                    saveToViewStack(position, view);
                                    final ViewGroup viewGroup = (ViewGroup) view.findViewById(R.id.time_card2);
                                    view.setTag(R.string.card_undo, "true");
                                    viewGroup.addView(view.inflate(TimerSummary.this, R.layout.timeslot_card_undo, null));
                                }
                            } else {
                                Log.d(TAG, "Removing Item");
                                deleteTimeSlot(timerInstanceList.get(position));
                                Toast.makeText(TimerSummary.this, "Deleted!", Toast.LENGTH_SHORT).show();
                                timerInstanceList.remove(position);
                                finalSummaryAdapter.notifyItemRemoved(position);
                            }

                    }
                    finalSummaryAdapter.notifyDataSetChanged();
                }
                @Override
                public void onDismissedBySwipeRight(RecyclerView recyclerView, int[] ints) {
                    for (int position:ints){
                        View view = recyclerView.getChildAt(position);
                        if(view.getTag(R.string.card_undo) != null && view.getTag(R.string.card_undo).equals("true")){
                            viewStack = null;
                            recyclerView.setAdapter(finalSummaryAdapter);
                        }
                    }

                }
            });
Run Code Online (Sandbox Code Playgroud)

当项目更多(需要滚动)

View view = recyclerView.getChildAt(position);
Run Code Online (Sandbox Code Playgroud)

返回一个空引用,导致应用程序崩溃.

我怀疑我使用错误的方法来观察.我应该使用与viewholder相关的东西,我实际上对如何从viewholder获取你想要的视图感到困惑.

如果有人可以分享任何有用的东西,那就太好了!如果有人想要,我会很乐意提供更多信息,

yig*_*git 20

你应该用findViewHolderForAdapterPosition. https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html#findViewHolderForAdapterPosition(int)

请记住,如果未布置位置(例如,越界或移除),它将返回null.

  • RecyclerView代表一个可能很长的项目列表,其中包含少量视图(足以填满屏幕).GetChildAt是一个ViewGroup方法,与适配器位置无关.因此,当RV显示100项适配器的项目20到30时,视图组中只有10个子项(0处的子项是适配器项20等).这就是RV提供适配器索引方法的原因. (5认同)
  • 它将返回null,因为当您调用`notifyDataSetChanged`时,所有视图都无效,直到另一个布局计算发生. (2认同)

Bra*_*nsh 8

由于我没有足够的声誉点来评论@ yigit的答案,我想我会想办法从RecyclerView中检索所有viewHolders,无论当前在viewGroup中是什么.即使使用findViewHolderForAdapterPosition和ForLayoutPosition,我们仍然可以在RecyclerView中获取ViewHolder的null实例.

为了避免这种情况,我们可以使用findViewHolderForItemId [ 1 ]并使用RecyclerView.Adapter #getItemId(int position)[ 2 ] 在适配器中传递viewHolder的ID.

for (int i = 0; i < mAdapter.getItemCount(); i++) {
    RecyclerView.ViewHolder holder = 
            mRecyclerView.findViewHolderForItemId(mAdapter.getItemId(i));
}
Run Code Online (Sandbox Code Playgroud)
  1. https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html#findViewHolderForItemId(int)
  2. https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html#getItemId(int)