当前位置: 首页 > 知识库问答 >
问题:

Android回收站查看防止回收所有物品

赵立果
2023-03-14

我有一个recycle view,用户可以在其中将一个项目拖放到recycle view中的不同位置。

到目前为止,一切正常。

我的问题始于RecyclerView中的项目超过了它可以显示的数量。所以当它回收他的内容时。当用户将项目拖放到不同的位置,然后滚动离开该零件时,不会保存位置更改。用户只看到项目的旧位置。

您可以在下面的.gif中看到此问题。

我已经尝试了几件事,比如:

    recyclerViewItem.getRecycledViewPool().setMaxRecycledViews(0,0);
        
recyclerViewItem.setItemViewCacheSize(30);

holder.setIsRecyclable(false);

在我的onBindViewHolder中。

但似乎没有什么对我有用。

有人知道这个问题的解决方案吗?

我的片段类:

public class ShoppinglistFragment extends Fragment {

private ViewModel viewModel;
private ShoppinglistAdapter adapterShoppingItem = new ShoppinglistAdapter();
private RecyclerView recyclerViewItem;
private Boolean fragmentStarted = false;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.shoppinglist_layout, container, false);
    recyclerViewItem = view.findViewById(R.id.recyclerViewShoppinglist);
    return view;
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    viewModel = ViewModelProviders.of(getActivity()).get(ViewModel.class);
    
    fragmentStarted = true;

    recyclerViewItem.setLayoutManager(new LinearLayoutManager(getContext()));
    recyclerViewItem.setHasFixedSize(false);
    recyclerViewItem.getRecycledViewPool().setMaxRecycledViews(0,0);
    recyclerViewItem.setItemViewCacheSize(30);
    recyclerViewItem.setAdapter(adapterShoppingItem);

    ItemTouchHelper.Callback callback =
            new ItemMoveCallback(adapterShoppingItem);
    ItemTouchHelper touchHelper = new ItemTouchHelper(callback);
    touchHelper.attachToRecyclerView(recyclerViewItem);

    //fetch all Shoppinglist Items from local storage
    viewModel.getAllShoppinglistItems().observe((LifecycleOwner) this, new Observer <List<Shoppinglist>>() {
        @Override
        public void onChanged(@Nullable List<Shoppinglist> items) {

            if (fragmentStarted){
                adapterShoppingItem.submitList(items);

                fragmentStarted = false;
            }
        }
    });

    adapterShoppingItem.setOnPositionChanged(new ShoppinglistAdapter.onPositionChanged() {
        @Override
        public void onPositionChanged(Shoppinglist fromItem, Shoppinglist toItem, int fromPosition, int toPosition) {

            int fromPositionServer = fromItem.getPosition();
            int toPositionServer = toItem.getPosition();

            fromItem.setPosition(toPositionServer);
            toItem.setPosition(fromPositionServer);


            //updating Shoppinglist Item locally
            viewModel.updateItem(fromItem);
            viewModel.updateItem(toItem);

        }
    });
}

}}

和我的适配器类:

public class ShoppinglistAdapter extends ListAdapter<Shoppinglist, ShoppinglistAdapter.NoteHolder> implements ItemMoveCallback.ItemTouchHelperContract {

public Integer ressourceType;
private onPositionChanged onPositionChanged;
private ArrayList<Shoppinglist> globalItemList = new ArrayList<Shoppinglist>();

public ShoppinglistAdapter() {
    super(DIFF_CALLBACK);
    Integer valueOf = Integer.valueOf(0);
    this.ressourceType = valueOf;
}

private static final DiffUtil.ItemCallback<Shoppinglist> DIFF_CALLBACK = new DiffUtil.ItemCallback<Shoppinglist>() {
    @Override
    public boolean areItemsTheSame(Shoppinglist oldItem, Shoppinglist newItem) {
        return oldItem.getSqlid() == newItem.getSqlid();
    }

    @Override
    public boolean areContentsTheSame(Shoppinglist oldItem, Shoppinglist newItem) {
        return oldItem.getTitle().equals(newItem.getTitle());
    }
};

@NonNull
@Override
public NoteHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.shoppinglist_item, parent, false);

    return new NoteHolder(itemView);
}

@Override
public void onBindViewHolder(@NonNull NoteHolder holder, int position) {
    Shoppinglist currentItem = getItem(position);
    
    holder.setIsRecyclable(false);

    holder.tv.setText(currentItem.getTitle());
    ...
}

public Shoppinglist getNoteAt(int position) {
    return getItem(position);
}

public class NoteHolder extends RecyclerView.ViewHolder {
    private TextView   tv;

    public NoteHolder(View itemView) {
        super(itemView);
        tv= itemView.findViewById(R.id.tv);
        globalItemList .add(currentNote);
    }
}

public interface onPositionChanged {
    void onPositionChanged(Shoppinglist fromItem, Shoppinglist toItem, int fromPosition, int toPosition);
}

public void setOnPositionChanged(ShoppinglistAdapter.onPositionChanged listener) {
    this.onPositionChanged = listener;
}

@Override
public void onRowMoved(int fromPosition, int toPosition) {

    //send switched Items to Fragment 
    onPositionChanged.onPositionChanged(globalItemList.get(fromPosition), globalItemList.get(toPosition), fromPosition, toPosition);

    //switch Items inside of the global Item List 
    Collections.swap(globalItemList, fromPosition, toPosition);
    
    notifyItemMoved(fromPosition, toPosition);
}

@Override
public void onRowSelected(NoteHolder myViewHolder) {}

@Override
public void onRowClear(NoteHolder myViewHolder) {}

@Override
public int getItemViewType(int position) {
    return super.getItemViewType(position);
}

}

共有1个答案

方权
2023-03-14

问题是您应该交换< code>ListAdapter.mDiffer中的项目,它保存当前的播放列表。因此,代码中的< code>globalItemList未被使用。将适配器的< code>onRowMoved替换为以下内容:

@Override
public void onRowMoved(int fromPosition, int toPosition) {
    ArrayList<Shoppinglist> list = new ArrayList(getCurrentList());
    Collections.swap(list, fromPosition, toPosition);
    submitList(list);
}
 类似资料:
  • 当试图从API获取JSON数据并在RecyclerView上显示时,我得到以下错误: 我已经使用RecyclerView有时,我从来没有这个问题。 主要活动: 适配器: 取景框: 我搜索了很多如何解决这个错误,但我不能。

  • 为主机、硬盘、镜像资源提供回收站功能。避免资源误删除导致数据丢失。 为了避免因为删除误操作而导致的数据丢失风险,云管平台提供了回收站功能。回收站用于临时存放用户删除的主机(包括虚拟机和裸金属)、硬盘、镜像文件。回收站功能仅支持管理员用户使用,普通用户不可见。 虚拟机 主机回收站用于存放用户删除的虚拟机和裸金属文件。 硬盘 硬盘回收站用于存放用户删除的硬盘文件。 镜像 镜像回收站用于存放用户删除的镜

  •       已删除的文件/文件夹/团队空间将统一进入到回收站,可以从回收站对文件进行恢复或者彻底删除。

  • 回收站包含已删除的表和任何关联的对象如索引、约束、嵌套表。在主窗口中,点击 “其他”->“回收站”来打开回收站的对象列表。 还原一个表 在对象选项卡选择一个表。 点击 “闪回表”。 移除一个对象 在对象选项卡选择一个要清除的对象。 点击 “清除对象”。 在对话窗口中确认删除。 移除全部对象 右击对象选项卡的任意位置并在弹出式菜单中选择“清除回收站”。 在对话窗口中确认删除。 移除每个用户的全部对象

  • 回收站包含已删除的表和任何关联的对象如索引、约束、嵌套表。在主窗口中,点击 “其他”-> “回收站”来打开回收站的对象列表。 还原一个表 在对象选项卡选择一个表。 点击 。 移除一个对象 在对象选项卡选择一个要清除的对象。 点击 。 在对话窗口中确认删除。 移除全部对象 按住 Control 键并点按对象选项卡的任意位置,然后在弹出式菜单中选择“清除回收站”。 在对话窗口中确认删除。 移除每个用户

  • 回收站包含已删除的表和任何关联的对象如索引、约束、嵌套表。在主窗口中,点击 “其他”->“回收站”来打开回收站的对象列表。 还原一个表 在对象选项卡选择一个表。 点击 “闪回表”。 移除一个对象 在对象选项卡选择一个要清除的对象。 点击 “清除对象”。 在对话窗口中确认删除。 移除全部对象 右击对象选项卡的任意位置并在弹出式菜单中选择“清除回收站”。 在对话窗口中确认删除。 移除每个用户的全部对象