【问题标题】:Undo swipe in recycler view on pressing back button?按下后退按钮时撤消在回收站视图中的滑动?
【发布时间】:2017-03-06 14:50:52
【问题描述】:

如何在 recyclerView 中按返回按钮恢复滑动视图?

我的代码

RecyclerListAdapter.java

public class RecyclerListAdapter extends RecyclerView.Adapter<RecyclerListAdapter.ItemViewHolder>
        implements ItemTouchHelperAdapter {


    private final List<Card> mItems = new ArrayList<>();

    Card car1 = new Card(R.drawable.card1, "Text First");
    Card car2 = new Card(R.drawable.card1, "Text Second");
    Card car3 = new Card(R.drawable.card3, "Text First");
    Card car4 = new Card(R.drawable.card4, "Text Second");
    Card car5 = new Card(R.drawable.card3, "Text First");
    Card car6 = new Card(R.drawable.card2, "Text Second");

    public RecyclerListAdapter() {
        mItems.addAll(Arrays.asList(car1, car2,car3,car4,car5,car6));
    }

    @Override
    public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card, parent, false);
        ItemViewHolder itemViewHolder = new ItemViewHolder(view);
        return itemViewHolder;
    }

    @Override
    public void onBindViewHolder(ItemViewHolder holder, int position) {
        final Card card = mItems.get(position);
        holder.textView.setText(card.getText());
        holder.imageView.setImageResource(card.getImage());

    }

    @Override
    public void onItemDismiss(int position) {

        mItems.remove(position);
        notifyItemRemoved(position);
    }

    @Override
    public void onItemMove(int fromPosition, int toPosition) {
        Card prev = mItems.remove(fromPosition);
        mItems.add(toPosition > fromPosition ? toPosition - 1 : toPosition, prev);
        notifyItemMoved(fromPosition, toPosition);
    }

    @Override
    public int getItemCount() {
        return mItems.size();
    }


    public static class ItemViewHolder extends RecyclerView.ViewHolder implements
            ItemTouchHelperViewHolder {

        public final TextView textView;
        public final ImageView imageView;

        public ItemViewHolder(View itemView) {
            super(itemView);
            textView = (TextView) itemView.findViewById(R.id.heading_text);
            imageView= (ImageView)itemView.findViewById(R.id.image);

        }

        @Override
        public void onItemSelected() {
            itemView.setBackgroundColor(Color.LTGRAY);
        }

        @Override
        public void onItemClear() {
            itemView.setBackgroundColor(0);
        }
    }
}

SimpleItemTouchHelperCallback.java

public class SimpleItemTouchHelperCallback extends ItemTouchHelper.Callback {

    private final ItemTouchHelperAdapter mAdapter;

    public SimpleItemTouchHelperCallback(ItemTouchHelperAdapter mAdapter) {
        this.mAdapter = mAdapter;
    }

    @Override
    public boolean isLongPressDragEnabled() {
        return false;
    }

    @Override
    public boolean isItemViewSwipeEnabled() {
        return true;
    }


    @Override
    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        int dragFlags = 0;
        int swipeFlags = ItemTouchHelper.END;
        return makeMovementFlags(dragFlags, swipeFlags);
    }

    @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
        mAdapter.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
        return true;
    }

    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
        mAdapter.onItemDismiss(viewHolder.getAdapterPosition());

    }


    public void onSelectedChange(RecyclerView.ViewHolder viewHolder, int actionstate) {
        if (actionstate != ItemTouchHelper.ACTION_STATE_IDLE) {
            ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder;
            itemViewHolder.onItemSelected();
        }
        super.onSelectedChanged(viewHolder, actionstate);
    }
    @Override
    public void clearView(RecyclerView recyclerView,RecyclerView.ViewHolder viewHolder){
        super.clearView(recyclerView,viewHolder);

        ItemTouchHelperViewHolder itemViewHolder =  (ItemTouchHelperViewHolder) viewHolder;
        itemViewHolder.onItemClear();
    }
}

ItemTouchHelperAdapter.java

public interface ItemTouchHelperAdapter {
void onItemMove(int fromPosition, int toPosition);
void onItemDismiss(int position);
}

ItemTouchHelperViewHolder.java

public interface ItemTouchHelperViewHolder {
 void onItemSelected();
   void onItemClear();

}

一切正常,但我需要知道如何在按下返回按钮时恢复滑动视图。

【问题讨论】:

    标签: android android-recyclerview itemtouchhelper


    【解决方案1】:

    在您的 OnItemDismiss 方法中,保存要删除的项目的副本,然后只需创建一个 OnItemRestore 方法将其放回适配器中。

    从Activity的OnBackPressed方法调用新方法

    private Object lastRemovedItem;
    private int lastIndex=-1;
    
    @Override
    public void onItemDismiss(int position) {
    
        lastRemovedItem=mItems.get(position);
        lastindex=position;
    
        mItems.remove(position);
        notifyItemRemoved(position);
    }
    
    public void restoreLastItem(){
       if (lastIndex==-1) return;
       mItems.add(lastindex,lastRemovedItem);
       notifyItemInserted(lastIndex);
       lastRemovedItem=null;
       lastIndex=-1;
    }
    

    【讨论】:

    • 我应该在 onSwiped 方法中保存项目的副本吗??
    • 没有。我在OnItemDismiss 方法中说过。将保存的项目存储在您的适配器类中,然后很容易恢复 fgrom 我建议的新方法。用示例查看已编辑的答案
    • 非常感谢,它只适用于最后一个删除的视图,如果我想要之前的视图怎么办?
    • 同理。删除时保存所需的内容,然后在需要时恢复它们。
    • 好的,但是我可以循环播放它,因为它是一个卡片视图,我将禁用垂直滚动,所以必须按顺序滑动我的问题是我可以循环它,因为每次 OnBackPressed 被称为滑动视图已恢复 & 在此之前 & 在此之前直到第一个。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    • 2010-12-23
    • 1970-01-01
    • 2021-12-17
    相关资源
    最近更新 更多