7

まず、これに一日中取り組みましたが、何もできませんでした。RecyclerViewを使用するアダプターを持っていRecyclerViewます SortedListTouchHelperコールバッククラスで実装してみました:

public class TimerListTouchHelperCallback extends ItemTouchHelper.SimpleCallback {

    private OnItemChangeListener onItemChangeListener;

    public TimerListTouchHelperCallback(OnItemChangeListener listener, int dragDirs, int swipeDirs) {
        super(dragDirs, swipeDirs);

        this.onItemChangeListener = listener;

    }

    @Override
    public int getSwipeDirs(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        TimerHolder holder = (TimerHolder) viewHolder;

        int holderState = holder.getState();

        if (holderState == TimerHolder.TIMER_PENDING_DELETE) return 0;
        else return super.getSwipeDirs(recyclerView, viewHolder);
    }

    @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
        return false;
    }




    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
        TimerHolder holder = (TimerHolder) viewHolder;

        int position = holder.getAdapterPosition();
        // ViewHolder's state is changed that should handle the layout change.
        holder.setState(TimerHolder.TIMER_PENDING_DELETE); 

        if (onItemChangeListener != null) onItemChangeListener.onItemSwiped(position);
    }


    protected interface OnItemChangeListener{
        void onItemSwiped(int position);
    }
}

これがTouchHelperの初期化です

timerAdapter = new TimerAdapter(this, timerList);
    timerListView.setAdapter(timerAdapter);

TimerListTouchHelperCallback touchHelperCallback = new TimerListTouchHelperCallback(
        timerAdapter,
        ItemTouchHelper.LEFT,
        ItemTouchHelper.LEFT);

ItemTouchHelper swipeToDismissTouchHelper = new ItemTouchHelper(touchHelperCallback);

swipeToDismissTouchHelper.attachToRecyclerView(timerListView);

私のアダプターはインターフェースを実装していますOnItemChangeListener

@Override
public void onItemSwiped(int position) {
    notifyItemChanged(position);
    removalPendingTimers.add(timerList.get(position));
}

MyViewHolderは状態を読み取り、状態になるとTimerHolder.TIMER_PENDING_DELETEビューの残りの部分を非表示にし、元に戻すボタンのあるインターフェイスを表示します。しかし、ビューをスクロールアウトして再度スクロールするまで、これは起こりません。私が欠けているものはありますか?

問題事例

リンク

アダプタ クラス ViewHolder クラス

4

2 に答える 2

4

やっと実行に移せました。それnotifyItemChangedをカットしていなかったので(それがあるべきです)、私notifyItemRemovednotifyItemInserted.

少し遅れますが、動作します。

于 2016-08-18T20:05:23.143 に答える
3

質問をよりよく理解するために、Android アプリの簡単な例を作成しました。

notifyItemChanged(position);を利用します。ユーザーがアイテムを左または右にスワイプして元に戻すビューを表示したとき。元に戻す時間が経過すると、notifyItemRemoved(position)を呼び出してリストから削除します。たとえば、GIF を参照してください。空の行は残りません。

https://github.com/DawidvanGraan/ExampleRecycleViewSwipeDismiss

于 2016-08-18T14:54:51.950 に答える