RecyclerView에 대해 스 와이프하여 닫기 [닫힘]


116

내가 사용 SwipeToDismiss의 라이브러리하지만 지금은 RecyclerView과 상황이 그리 명확하지 않습니다에이 lib에 대한 교체를 알고, 마이그레이션하기 위해 노력하고있어? 처음부터 구현하는 방법에 대한 아이디어가 있습니까?


1
Recyclerview에 대한 제스처 생성을 더 쉽게 만들기 위해 ItemTouchHelper를 사용하는 작은 라이브러리를 만들었습니다. 여기에서 찾을 수 있습니다. github.com/olmur/rvtools
Olexii Muraviov

답변:


337

v22.2.0부터 Android 지원 팀에는 ItemTouchHelper스 와이프 하여 닫기 및 드래그 앤 드롭을 매우 간단하게 만드는 클래스 가 포함되었습니다 . 이것은 일부 라이브러리만큼 완전한 기능을 갖추고 있지 않을 수 있지만 Android 팀에서 직접 제공합니다.

  • RecyclerView 라이브러리의 v22.2. +를 가져 오도록 build.gradle을 업데이트하세요.

    compile 'com.android.support:recyclerview-v7:22.2.+'
  • 적절한 SimpleCallback으로 ItemTouchHelper 인스턴스화

    ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
        [...]
        @Override
        public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
            //Remove swiped item from list and notify the RecyclerView
        }
    };
    
    ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
    

    ** SimpleCallback은 드래그 앤 드롭을 활성화하려는 방향과 스 와이프를 활성화하려는 방향을 취합니다.

  • RecyclerView에 연결

    itemTouchHelper.attachToRecyclerView(recyclerView);

7
스 와이프 한 항목의 색인을 어떻게 얻을 수 있습니까?
MaTTo

37
@Orochi .NET에서 getAdapterPosition () 을 호출 합니다 viewHolder.
SqueezyMo

1
그들은 분명히이 구성 요소의 디자인에 너무 많은 고려를하지 않았습니다. RecyclerView에서만 작동합니다. 스 와이프하여 닫기는 스낵바와 같은 항목에 존재합니다. 모든 뷰에서 사용할 수있는보다 일반적인 구성 요소가 더 환영 받았을 것입니다.
AndroidDev

4
사용자가 부분적으로 스 와이프 한 다음 뷰를 다시 제자리로 드래그하는 경우를 처리하려면 어떻게해야합니까? 분명히 이것은 가능하지 않습니다 (?) 편집 : 좋아, 가능하지만보기가 해제 될 때 스 와이프되기 전에 머물 수있는 여백이 아주 적습니다. 어떠한 제안?
Matteo

2
@Matteo : ItemTouchHelper.Callback를 구현하고 getSwipeThreshold를 오버라이드 (override) ()
태그 Sofi 소프트웨어 LLC

36
 ItemTouchHelper.SimpleCallback simpleCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {
        @Override
        public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
            return false;
        }

        @Override
        public void onSwiped(final RecyclerView.ViewHolder viewHolder, int direction) {
            final int position = viewHolder.getAdapterPosition(); //get position which is swipe

            if (direction == ItemTouchHelper.LEFT) {    //if swipe left

                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); //alert for confirm to delete
                builder.setMessage("Are you sure to delete?");    //set message

                builder.setPositiveButton("REMOVE", new DialogInterface.OnClickListener() { //when click on DELETE
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        adapter.notifyItemRemoved(position);    //item removed from recylcerview
                        sqldatabase.execSQL("delete from " + TABLE_NAME + " where _id='" + (position + 1) + "'"); //query for delete
                        list.remove(position);  //then remove item

                        return;
                    }
                }).setNegativeButton("CANCEL", new DialogInterface.OnClickListener() {  //not removing items if cancel is done
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        adapter.notifyItemRemoved(position + 1);    //notifies the RecyclerView Adapter that data in adapter has been removed at a particular position.
                        adapter.notifyItemRangeChanged(position, adapter.getItemCount());   //notifies the RecyclerView Adapter that positions of element in adapter has been changed from position(removed element index to end of list), please update it.
                        return;
                    }
                }).show();  //show alert dialog
            }
        }
    };
    ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleCallback);
    itemTouchHelper.attachToRecyclerView(recyclerView); //set swipe to recylcerview

여기 코드에서 사용자가 왼쪽으로 스 와이프하면 AlertDialog가 표시되고 사용자가 REMOVE를 선택하면 데이터베이스에서 항목이 삭제되고 recyclerview가 새로 고쳐지고 사용자가 CANCEL을 선택하면 recyclerview가있는 그대로입니다.


잘 작동합니다 .. 좋은 대답입니다.
Sagar Chavada

대박! 구현하기 쉬움
dianakarenms

1
당신은 정말 방향 검사가 필요하지 않습니다 if (direction == ItemTouchHelper.LEFT) // if swipe left은 다음과 같이 ItemTouchHelper.SimpleCallback그냥 슬쩍 방향으로 제한됩니다. 왼쪽과 오른쪽으로 스 와이프하고 싶다면 ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT)방향을 확인해야합니다.
Jacko

1
AlertDialog 바깥 쪽을 클릭하면 대화 상자가 취소되지만 다시 스 와이프 한 항목은 넣지 않았습니다. 빌더에 OnCancelListener를 추가하는 것을 캡처 할 수 있습니다AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);builder.setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { // stuff to put the item back } });
Jacko

1
+1 잘 작동합니다. 나는 더 논리적 인 imho가 adapter.notifyItemChanged(position);아닌 스 와이프 된 항목을 다시 가져 왔습니다 notifyItemRemoved.
winwaed

14

이 라이브러리를 사용해 볼 수 있습니다.

https://github.com/daimajia/AndroidSwipeLayout

업데이트 : RecyclerView와 함께 사용할 수있는 또 다른 좋은 라이브러리를 찾았습니다.

https://github.com/hudomju/android-swipe-to-dismiss-undo


나는 github.com/krossovochkin/Android-SwipeToDismiss-RecyclerView 와 유사한 내 자신의 구현을 만들었습니다 . 유일한 요구 사항은 "실행 취소"버튼을 사용하여 토스트를 표시하는 것이 었으며 라이브러리에는 포함되지 않았습니다.
Viktor Yakunin 2015

1
Daimajia의 라이브러리는 스 와이프하여 닫기 기능을 지원하지 않습니다.
akohout

@raveN 방금 내 대답을 업데이트했습니다.
Pierpaolo Paolini


2

리사이클 러 뷰에서 스 와이프-삭제-실행 취소 기능을 지원하는 SwipeToDeleteRV 라이브러리를 작성 했습니다 . ItemTouchHelper를 기반으로하며 사용하기 매우 쉽습니다.

같은 문제에 직면 한 사람에게 도움이되기를 바랍니다.

예를 들어, XML 레이아웃에서 리사이클 러 뷰를 정상적으로 정의하고 몇 가지 선택적 속성을 정의 할 수 있습니다.

...
xmlns:stdrv="http://schemas.android.com/apk/res-auto"
...
<io.huannguyen.swipetodeleterv.STDRecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
stdrv:border_color="@android:color/darker_gray" // specify things like border color, border width, etc.
stdrv:delete_view_background="#cccccc"
stdrv:delete_icon="@drawable/ic_archive"
stdrv:delete_icon_height="24dp"
stdrv:delete_icon_width="24dp"
stdrv:left_delete_icon_margin="32dp"
stdrv:delete_message="@string/delete_message"
stdrv:right_delete_icon_margin="32dp"
stdrv:delete_icon_color="#000000"
stdrv:has_border="true"/>

모든 stdrv 속성은 선택 사항입니다. 지정하지 않으면 기본값이 사용됩니다.

그런 다음 STDAdapter를 하위 클래스로 만드는 어댑터를 만들고 수퍼 클래스 생성자를 호출해야합니다. 이 같은:

public class SampleAdapter extends STDAdapter<String> {
public SampleAdapter(List<String> versionList) {
    super(versionList);
}

}

다음으로 setupSwipeToDelete스 와이프하여 삭제 기능을 설정하는 메서드를 호출해야합니다 .

mRecyclerView.setupSwipeToDelete(your_adapter_instance, swipe_directions);

swipe_directions 항목을 스 와이프 할 수있는 방향입니다.

예:

// Get your recycler view from the XML layout
mRecyclerView = (STDRecyclerView) findViewById(R.id.recycler_view);
LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
mRecyclerView.setLayoutManager(layoutManager);
mAdapter = new SampleAdapter(versions);
// allow swiping in both directions (left-to-right and right-to-left)
mRecyclerView.setupSwipeToDelete(mAdapter, ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT);

그게 다야! 고급 설정 (즉, 항목마다 다른 삭제 메시지 설정, 항목 임시 및 영구 제거 ...)은 프로젝트 읽어보기 페이지를 참조하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.