gpt4 book ai didi

android - 为什么我的带有 ItemTouchHelper 的 RecyclerView 在重写 getItemViewType() 之后仅在一项后停止拖动?

转载 作者:太空宇宙 更新时间:2023-11-03 13:47:07 25 4
gpt4 key购买 nike

我有一个简单的 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 上的覆盖并为所有项目使用相同的布局,一切正常,但我非常想找到解决此问题的方法。任何帮助将不胜感激:)

最佳答案

适配器认为您移动的两个 ViewHolder 被认为是不同类型,因为 getItemViewType() 返回的类型是唯一的。所以它应该重新渲染。

例如,您可以按照我的程序返回类型:

为 r.layout.foo 返回 0

为 r.layout.bar 返回 1

然后当您想要按类型布局时,您可以编写自己的方法/对来检查布局。如果您仍然需要该位置,您可以在创建ViewHolder 后获取它:AdapterPosition

如果您需要 OnCreateViewHolder() 中的位置,则您有问题并且可能会破坏 ViewHolder 的目的。考虑在操作数据时或 onBindViewHolder() 时执行此操作(如果不是那么昂贵的话)。

关于android - 为什么我的带有 ItemTouchHelper 的 RecyclerView 在重写 getItemViewType() 之后仅在一项后停止拖动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39996110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com