我一直在为我的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);
}
}
}
});
当项目更多(需要滚动)时
View view = recyclerView.getChildAt(position);
返回一个空引用,导致应用程序崩溃。
我怀疑我使用错误的方法来观察。我应该使用与viewholder相关的东西,我实际上对如何从viewholder获取你想要的视图感到困惑。
如果有人可以分享任何有用的东西,那就太棒了! 如果有人想要,我会很乐意提供更多信息,
答案 0 :(得分:20)
您应该使用findViewHolderForAdapterPosition
。
https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html#findViewHolderForAdapterPosition(int)
请记住,如果未布置位置(例如越界或移除),它将返回null。
答案 1 :(得分: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));
}
答案 2 :(得分:1)
使用findFirstCompletelyVisibleItemPosition()&amp;您的RecyclerView的LayoutManager上的findLastVisibleItemPosition()方法可以找出您要查找的孩子是否可见。如果它是可见的,那么您可以使用getChild(index)来获取该特定子项的ViewHolder实例,并且它不会为null,否则它可能为null(如果子项不在其中)。如果您的孩子不可见,您只需在您的特定位置List对象中进行更改,下次每当它可见时都会更新UI。
if (selectedPosition >= linearLayoutManager.findFirstVisibleItemPosition()
&& selectedPosition <= linearLayoutManager.findLastVisibleItemPosition()){
linearLayoutManager.getChildAt(selectedPosition).setBackgroundResource(0);
}