簡體   English   中英

在重寫getItemViewType()之后,為什么帶有ItemTouchHelper的RecyclerView在只有一個項目之后停止拖動?

[英]Why does my RecyclerView with ItemTouchHelper stop dragging after only one item, after overriding getItemViewType()?

我有一個簡單的RecyclerView,它使用ItemTouchHelper來滑動和拖動項目。 一切正常,直到我需要以不同方式設置第一個和最后一個項目的樣式,所以我需要覆蓋適配器中的getItemViewType(int p)函數。 在我這樣做之后,拖動功能停止流暢,並且在向上/向下移動一個位置后總是丟棄項目。 這是我的RecyclerView適配器:

public class CurrentStopsAdapter extends RecyclerView.Adapter<CurrentStopsAdapter.ViewHolder> {
private RemoveFromTripListener removeFromTripListener = null;
private SwapPlacesTripListener swapPlacesTripListener = null;
private Context context;
private List<PlaceLink> stops;

public CurrentStopsAdapter(Context context, List<PlaceLink> stops,
                           RemoveFromTripListener removeListener, SwapPlacesTripListener swapListener) {
    this.context = context;
    this.stops = stops;
    removeFromTripListener = removeListener;
    swapPlacesTripListener = swapListener;
}

public interface RemoveFromTripListener {
    void onRemoveTripButtonClick(String id);
}

public interface SwapPlacesTripListener {
    void onSwapPlacesButtonClick(int first, int second);
}

@Override
public int getItemViewType(int position) {
    if (position == (getItemCount()-1)) {
        return -1;
    }
    return position;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    switch (viewType) {
        case -1:
            return new ViewHolder(LayoutInflater.from(context).inflate(R.layout.list_item_destination, parent, false));
        case 0:
            return new ViewHolder(LayoutInflater.from(context).inflate(R.layout.list_item_origin, parent, false));
        default:
            return new ViewHolder(LayoutInflater.from(context).inflate(R.layout.list_item_stop, parent, false));
    }
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    holder.bindStop(stops.get(position));
}

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

public void remove(int position) {
    if (removeFromTripListener != null) {
        removeFromTripListener.onRemoveTripButtonClick(stops.get(position).getId());
    }
    notifyItemRemoved(position);
}

public void swap(int firstPosition, int secondPosition) {
    if (swapPlacesTripListener != null) {
       swapPlacesTripListener.onSwapPlacesButtonClick(firstPosition, secondPosition);
    }
    notifyItemMoved(firstPosition, secondPosition);
}

public class ViewHolder extends RecyclerView.ViewHolder {
    public final TextView placeTitle;

    public ViewHolder(View view){
        super(view);
        placeTitle = (TextView) view.findViewById(R.id.stops_list_item_title);
    }

    public void bindStop(PlaceLink place){
        this.placeTitle.setText(place.getTitle());

    }
}
}

和我的ItemTouchHelper:

public class TripTouchHelper extends ItemTouchHelper.SimpleCallback {
    private CurrentStopsAdapter currentStopsAdapter;

    public TripTouchHelper(CurrentStopsAdapter currentStopsAdapter){
        super(ItemTouchHelper.UP | ItemTouchHelper.DOWN, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT);
        this.currentStopsAdapter = currentStopsAdapter;
    }

    @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
        currentStopsAdapter.swap(viewHolder.getAdapterPosition(), target.getAdapterPosition());
        return true;
    }

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

}

如果我跳過getItemViewType上的Override並對所有項使用相同的布局,一切正常但我非常想找到解決這個問題的方法。 任何幫助將非常感激 :)

Adapter認為你移動的兩個ViewHolder被認為是不同的類型,因為getItemViewType()返回了唯一的類型。 所以它應該重新渲染。

例如,您可以按照我的過程返回類型:

為r.layout.foo return 0

為r.layout.bar return 1

然后,您可以編寫自己的方法/對,以便在需要按類型布局時檢查布局。 如果您還需要的位置 ,你可以得到它后ViewHolder創建: AdapterPosition

如果你需要OnCreateViewHolder()位置,你就會出錯並且可能會ViewHolder的目的。 考慮在操作數據時執行該操作或在onBindViewHolder()如果不那么昂貴。

在recyclerview適配器中刪除getItemViewType(int position)。 我有同樣的問題,這有效。

我認為你應該返回一個“類型”作為有問題的項目的int,而不是位置。 這意味着,對於頁眉/頁腳類型,您可以返回一個值(例如:1),而對於所有其他類型,您可以返回另一個值(例如:2)。 返回位置通過您的類型將每個移動視為不同的視圖類型,因為位置將是唯一的,我假設停止拖動。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM