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

未从RecyclerView正确删除的项目

曹浩
2023-03-14

我正在用AppWidgetHostViews填充RecyclerView。它们被排序一个比一个低,每个都有删除按钮旁边。这就是我如何设置RecyclerView和适配器(Event.Object是AppWidgetHostView):

        private List<View> viewList = new ArrayList<>();

        mAdapter = new AppWidgetAdapter(this);
        mRecycler.setLayoutManager(new LinearLayoutManager(getActivity()));
        mRecycler.setItemAnimator(new DefaultItemAnimator());
        mRecycler.setAdapter(mAdapter);
        viewList.add((View) event.eventObject);
        mAdapter.setData(viewList);

这是保存AppWidgetHostViews的适配器:

public class AppWidgetAdapter extends RecyclerView.Adapter<AppWidgetAdapter.AppWidgetHolder> {

private List<View> viewList = new ArrayList<>();
private AdapterListener listener;

public AppWidgetAdapter(AdapterListener listener) {
    this.listener = listener;
}

public void setData(List<View> list) {
    viewList.clear();
    viewList.addAll(list);
    notifyDataSetChanged();
}

@Override
public AppWidgetHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.app_widget_layout, parent, false);
    return new AppWidgetHolder(view);
}

@Override
public void onBindViewHolder(final AppWidgetHolder holder, int position) {
    final View view = getItem(position);
    holder.setView(view);
    holder.setNum(String.valueOf(position));

    holder.button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int pos = holder.getAdapterPosition();
            viewList.remove(pos);
            notifyItemRemoved(pos);
            notifyItemRangeRemoved(pos, viewList.size());
            listener.onItemRemoved(pos);
        }
    });
}

private View getItem(int position) {
    return !viewList.isEmpty() ? viewList.get(position) : null;
}

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

class AppWidgetHolder extends RecyclerView.ViewHolder {

    private FrameLayout view;
    private Button button;

    AppWidgetHolder(View itemView) {
        super(itemView);
        view = (FrameLayout) itemView.findViewById(R.id.app_widget);
        button = (Button) itemView.findViewById(R.id.delete);

    }

    private void setView (View view) {
        if(view.getParent() != null) {
            ((ViewGroup)view.getParent()).removeView(view);
        }
        this.view.addView(view);
    }

    private void setNum (String num) {
        this.button.setText(num);
    }

}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginBottom="20dp">

<Button
    android:layout_centerInParent="true"
    android:id="@+id/delete"
    android:layout_width="50dp"
    android:layout_alignParentEnd="true"
    android:layout_height="wrap_content"
    android:layout_marginLeft="5dp"
    tools:text="Del" />

<FrameLayout
    android:layout_toStartOf="@id/delete"
    android:layout_centerHorizontal="true"
    android:layout_centerInParent="true"
    android:id="@+id/app_widget"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentStart="true" />
   @Override
public void onItemRemoved(int position) {
    viewList.remove(position);
    mAdapter.setData(viewList);
} 

因此它再次为适配器设置数据并通知数据集已更改。

但问题是,当我单击“删除”按钮时,项目没有被正确删除。ViewList调整大小可以,但项目的行为很奇怪,如果我添加了3个项目并删除了第二个,例如,它留在屏幕上,但第三个在它上面(第二个仍然可见),那么,如果我删除了第一个,它留在屏幕上,以前的第二个现在被删除,新的第二个在第一个上面。但是如果我为每个项目点击delete按钮,它会删除所有的视图,但是在那个过程中它们会表现得很奇怪...有什么建议,暗示吗?

共有1个答案

龚彬
2023-03-14

尝试仅在OnBindViewWholder中添加以下代码

holder.button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        viewList.remove(position);
        notifyItemRemoved(position);
        //notifyDataSetChanged();
    }
});
 类似资料:
  • 删除项目后,“我的回收器”视图未更新。此recyclerView位于片段内部。我试过各种方法,但都不管用。 片段类中的适配器声明 回收服务适配器: } 调试项目时,我可以看到该项实际上正在从ArrayList中删除。但不在循环视图中更新。 删除后,如果滚动回收站视图,则从回收站视图中删除已删除的项。但不是没有滚动。

  • 问题内容: 我希望我的笔记应用程序能为您提供一些帮助。假设我的记事清单上有3个记事。我想删除列表顶部的注释。无论我尝试删除哪一个,始终会首先删除列表最底部的注释。我检查了React控制台,并且处于应用程序组件状态的notes数组表示已正确删除。但实际上,事实并非如此。如何获得它以便删除我选择的确切音符? 问题答案: 用作时发生此错误。React使用该属性来跟踪列表中的元素。当您从数组中间删除元素时

  • 在我的应用程序中,我在回收商视图中显示项目列表。我为回收商视图中的每个项目创建了两个功能编辑和删除。使用此应用程序,用户可以创建任务列表,可以编辑项目,也可以从回收器视图中删除项目。现在,如果我单击“编辑”,它就可以完美地工作。但是,如果我单击删除选项,则应用程序崩溃,并且消息数组索引在adaper类中因rance异常而崩溃。 这是我的适配器代码。我还提到了 代码中的行 ,其中我遇到了应用程序崩溃

  • 我有一个RecyclerView,这些物品应该在刷卡后移除。我用ItemTouchHelper类解决了这个问题。在onchildraw方法中,我设置了一个红色背景,在列表项后面滑动时出现。最重要的是,在正确的网站上有一个垃圾图标。它工作正常,但是如果你开始刷卡,但不刷卡到底,然后又刷卡回到正常位置,垃圾桶的图标不会消失。但是,它只有在我滑动所选项目时才会消失,而不是在普通项目上。 下面是ItemT

  • 问题内容: 从我的java(ant)项目中删除未使用的jar的最简单方法是(tool?)。我们的项目已经变得非常庞大,我们希望进行清理。有几个jar添加到类路径中,但并非全部都用于编译/运行。有没有一种方法可以通过从命令行运行一些实用程序来识别不必要的jar? 注意 :我们不想遵循删除一个或多个jar的繁琐过程,然后编译/运行以测试是否需要这些jar。 问题答案: 这就是我最终做的事情,我在编译时