내가 사용 SwipeToDismiss의 라이브러리하지만 지금은 RecyclerView과 상황이 그리 명확하지 않습니다에이 lib에 대한 교체를 알고, 마이그레이션하기 위해 노력하고있어? 처음부터 구현하는 방법에 대한 아이디어가 있습니까?
내가 사용 SwipeToDismiss의 라이브러리하지만 지금은 RecyclerView과 상황이 그리 명확하지 않습니다에이 lib에 대한 교체를 알고, 마이그레이션하기 위해 노력하고있어? 처음부터 구현하는 방법에 대한 아이디어가 있습니까?
답변:
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);
viewHolder
.
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가있는 그대로입니다.
if (direction == ItemTouchHelper.LEFT) // if swipe left
은 다음과 같이 ItemTouchHelper.SimpleCallback
그냥 슬쩍 방향으로 제한됩니다. 왼쪽과 오른쪽으로 스 와이프하고 싶다면 ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT)
방향을 확인해야합니다.
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 } });
adapter.notifyItemChanged(position);
아닌 스 와이프 된 항목을 다시 가져 왔습니다 notifyItemRemoved
.
이 라이브러리를 사용해 볼 수 있습니다.
https://github.com/daimajia/AndroidSwipeLayout
업데이트 : RecyclerView와 함께 사용할 수있는 또 다른 좋은 라이브러리를 찾았습니다.
이 라이브러리는 helpful.You 구현할 수있을 수 있습니다 undo
에 OnDissmiss
사용supertoast
리사이클 러 뷰에서 스 와이프-삭제-실행 취소 기능을 지원하는 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);
그게 다야! 고급 설정 (즉, 항목마다 다른 삭제 메시지 설정, 항목 임시 및 영구 제거 ...)은 프로젝트 읽어보기 페이지를 참조하십시오.