简体   繁体   English

使用 ItemTouchHelper.Callback 后如何按顺序设置项目 position

[英]How to set Item position in order after using ItemTouchHelper.Callback

I am creating a document arrangement activity with RecyclerView .我正在使用RecyclerView创建文档整理活动。 I want to arrange the document with drag and drop.我想通过拖放来排列文档。 It was done by using ItemTouchHelper.Callback but after that I can't set the page number after the OnItemMove callback.它是通过使用ItemTouchHelper.Callback完成的,但之后我无法在OnItemMove回调后设置页码。 what should I do?我应该怎么办?

EDIT: added code snippet编辑:添加代码片段

package adapters;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.graphics.pdf.PdfRenderer;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.RecyclerView;

import com.mobilix.docscanner.R;

import java.util.ArrayList;
import java.util.Collections;

import helper.ItemTouchHelperAdapter;
import helper.ItemTouchHelperViewHolder;
import helper.OnStartDragListener;
import helper.SimpleItemTouchHelperCallback;

public class PageAjdustAdapter extends RecyclerView.Adapter<PageAjdustAdapter.PageAdjustHolder> implements ItemTouchHelperAdapter, OnStartDragListener {
    private final String TAG = getClass().getName();
    Context mContext;
    ArrayList<PdfPage> pdfPages = new ArrayList<>();
    private ItemTouchHelper itemTouchHelper;

    public PageAjdustAdapter(Context context, ArrayList<PdfPage> pages) {
        this.mContext = context;
        pdfPages = pages;


        ItemTouchHelper.Callback callback = new SimpleItemTouchHelperCallback(this);
        itemTouchHelper = new ItemTouchHelper(callback);
        itemTouchHelper.attachToRecyclerView(((Activity) context).findViewById(R.id.rcvPageArrange));

    }

    @NonNull
    @Override
    public PageAdjustHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.item_page_adajustment, parent, false);
        return new PageAdjustHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull PageAdjustHolder holder, int position) {
        Log.d(TAG, "onBindViewHolder: ");
        holder.ivPage.setImageBitmap(pdfPages.get(position).bitmap);
        holder.cbPage.setChecked(pdfPages.get(position).isSelected);
        holder.tvPageNo.setText(String.valueOf(position + 1));

        holder.cbPage.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                pdfPages.get(holder.getAdapterPosition()).isSelected = isChecked;
            }
        });

        holder.ivRotate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int pos = holder.getAdapterPosition();
                pdfPages.get(pos).bitmap = Bitmap.createBitmap(//
                        pdfPages.get(pos).bitmap, 0, 0, pdfPages.get(pos).bitmap.getWidth(),//
                        pdfPages.get(pos).bitmap.getHeight(), pdfPages.get(pos).matrix, true);//

                notifyItemChanged(pos);
            }
        });
    }

    @Override
    public int getItemCount() {
        return pdfPages.size();
    }

    @Override
    public boolean onItemMove(int fromPosition, int toPosition) {
        Log.d(TAG, "onItemMove: ->fp " + (fromPosition + 1) + " tp-> " + (toPosition + 1));
        Collections.swap(pdfPages, fromPosition, toPosition);
        notifyItemMoved(fromPosition, toPosition);

        
        return false;
    }

    @Override
    public void onItemDismiss(int position) {
        pdfPages.remove(position);
        notifyItemRemoved(position);
    }

    @Override
    public void onStartDrag(RecyclerView.ViewHolder viewHolder) {
        itemTouchHelper.startDrag(viewHolder);

    }


    public static class PageAdjustHolder extends RecyclerView.ViewHolder implements
            ItemTouchHelperViewHolder {
        ImageView ivPage, ivRotate;
        CheckBox cbPage;
        TextView tvPageNo;

        public PageAdjustHolder(@NonNull View itemView) {
            super(itemView);
            ivPage = itemView.findViewById(R.id.ivPage);
            ivRotate = itemView.findViewById(R.id.ivRotate);
            cbPage = itemView.findViewById(R.id.cbPage);
            tvPageNo = itemView.findViewById(R.id.tvPageNo);
        }

        @Override
        public void onItemSelected() {

        }

        @Override
        public void onItemClear() {

        }
    }

    public static class PdfPage {
        PdfRenderer.Page page;
        Bitmap bitmap;
        boolean isSelected;
        Matrix matrix;
        int rotate = 0;

        public PdfPage(PdfRenderer.Page page, Bitmap bitmap) {
            this.page = page;
            this.bitmap = bitmap;
            matrix = new Matrix();
            rotate += 90;
            matrix.postRotate(90);//martix work on +=90
        }
    }

}

You have to call notifyDataSetChanged() when an item position is changed.更改项目 position 时,您必须调用 notifyDataSetChanged()。 The easiest way it to used onItemClear(), it will be called when an item is de-selected.最简单的方法是使用 onItemClear(),它会在项目被取消选择时调用。 Add it like following.像下面这样添加。

    @Override
    public void onItemClear() {
          notifyDataSetChanged();
    }

One thing you have to add is check weather the position is actually changed after the drag operation or not other wise it will always update the whole dataset whenever an item is selected and than de-selected.您必须添加的一件事是检查天气 position 在拖动操作后是否实际更改,否则无论何时选择和取消选择项目,它都会始终更新整个数据集。

Edit编辑

Create a local variable in view-holder class. Than you just have to set it in onItemSelected() and check it in onItemClear();在 view-holder class 中创建一个局部变量。您只需在 onItemSelected() 中设置它并在 onItemClear() 中检查它;

    @Override
    public void onItemSelected() {
        lastpos = getAdapterPosition();
    }


    @Override
    public void onItemClear() {
         if(lastpos != getAdapterPosition())
              notifyDataSetChanged();
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 RecyclerView ItemTouchHelper.Callback:拖动交换条件 - RecyclerView ItemTouchHelper.Callback: Dragging swap condition Android:Recyclerview 与 ItemTouchHelper.Callback 在列表中的较低项目上闪烁 - Android: Recyclerview with ItemTouchHelper.Callback flickering on lower items in list 使用 ItemTouchHelper 从 RecyclerView 中删除项目时引发 UnsupportedOperationException - UnsupportedOperationException is thrown when removing item from RecyclerView using ItemTouchHelper 如何按值而不是按位置设置 Spinner 的选定项目? - How to set selected item of Spinner by value, not by position? 如何为每个 position 设置折扣 class - How to set discount for each position in order class 如何正确使用ItemTouchHelper - How to use ItemTouchHelper properly 如何获取项目的 position 并使用 Cursor 将其删除? - How to get position of item and delete it using Cursor? 使用ItemTouchHelper在RecyclerView中悬停事件 - Hover event in RecyclerView using ItemTouchHelper java.util.List 在 .add(position, item) 之后被 Hibernate 乱序存储 - java.util.List being stored out of order by Hibernate after .add(position, item) 如何按位置设置列表视图中特定项目的背景颜色? - How to set the background color of a specific item in listview by position?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM