java - 如何正确使用 ItemTouchHelper

标签 java android android-recyclerview itemtouchhelper

我正在尝试将 RecyclerViewItemTouchHelper 一起用于基本的“拖放”和“滑动关闭”实现。 滑动工作正常,项目在适配器中正确删除,动画正确,但“拖放”行为非常奇怪。长按后 View 不会移动,但在适配器中交换项目是正确的。

this is how it works in my RecyclerView

and this is what I want

我的演示者中的这段代码,onSelectedChanged 和 clearView 只是为了清楚地演示如何选择项目。

    addedCitiesRecycler.setLayoutManager(llmAddedCities);

    adapterAddedCities = new AdapterAddedCities();


    ItemTouchHelper.SimpleCallback callback = new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN, ItemTouchHelper.START | ItemTouchHelper.END) {
        @Override
        public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
            adapterAddedCities.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
            return true;
        }

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

        @Override
        public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
            if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
                AdapterAddedCities.ViewHolder holder = (AdapterAddedCities.ViewHolder) viewHolder;
                holder.itemView.setBackgroundColor(Color.LTGRAY);
            }
            super.onSelectedChanged(viewHolder, actionState);
        }

        @Override
        public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
            AdapterAddedCities.ViewHolder holder = (AdapterAddedCities.ViewHolder) viewHolder;
            holder.itemView.setBackgroundColor(0);
        }
    };

    itemTouchHelper = new ItemTouchHelper(callback);
    itemTouchHelper.attachToRecyclerView(addedCitiesRecycler);

我的适配器中的这个方法

public void onItemDismiss(int position) {
    citiesData.remove(position);
    notifyItemRemoved(position);
}

public void onItemMove(int fromPosition, int toPosition) {
    CityInfo tmp = citiesData.remove(fromPosition);
    citiesData.add(toPosition > fromPosition ? toPosition - 1 : toPosition, tmp);
    notifyItemMoved(fromPosition, toPosition);
}

最佳答案

我已经将 com.android.support:recyclerview-v7:26.0.0-alpha1 更新为 com.android.support:recyclerview-v7:27.0.0在 build.gradle 中,它工作正常。

我认为这是库中的错误,所以如果您遇到同样的问题,只需将库更新到最新版本即可。

关于java - 如何正确使用 ItemTouchHelper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46515532/

相关文章:

java - 如何控制 JTextArea 上显示的内容?

java - MapStruct @MappingTarget 生成一个空方法

java - HttpClient - 使用 Tomcat Webdav 上传 JAR 文件导致 "invalid or corrupt jarfile"

android - 在 Android 中构建一个无限滚动的类似日历的 View

android - 如何在 Scrollview 中使用 Recyclerview

android - RecyclerView item selected 以及如何禁用 Touch 事件

java - IntelliJ 中的自动格式化行

Android:单行中的EditText提示

java - 关闭其他 Activity 中的 Activity ?

android - 在 android 中删除简单的 ListView 元素