首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确使用ItemTouchHelper

如何正确使用ItemTouchHelper
EN

Stack Overflow用户
提问于 2017-10-01 18:27:44
回答 1查看 2.2K关注 0票数 3

我正在尝试使用带有RecyclerViewItemTouchHelper来实现基本的“拖放”和“滑动-拒绝”实现。滑动正确工作,项目删除在适配器正确,动画是正确的,但“拖放”行为是非常奇怪的。在长点击视图没有移动之后,适配器中的交换项是正确的。

在我的RecyclerView中就是这样工作的

这就是我想要的

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

代码语言:javascript
复制
    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);

此方法在我的适配器中。

代码语言:javascript
复制
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);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-06 11:24:02

我已经将com.android.support:recyclerview-v7:26.0.0-alpha1更新为com.android.support:recyclerview-v7:27.0.0 in build.gradle,并且运行良好。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46515532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档