RecyclerView 正在复制警报对话框结果

RecyclerView is duplicating Alert Dialog results

我有一个片段应该在我的 RecyclerView 中显示我的警报对话框的结果。每次我单击对话框中的 "ADD" 时,它都会将重复的结果添加到我的 RecyclerView 中。我搜索了又搜索,但似乎找不到我做错了什么。我试过添加 .clear();但如果我添加它,我的 RecyclerView 中根本不会显示任何内容。我已将我的适配器 getItemId 和 getItemViewType 添加到 return 位置;但项目仍然重复。我添加了 adapter.setData(model) 后跟 adapter.notifyDataSetChange();我的 RecyclerView 仍然显示重复的项目。该应用程序运行,所以我没有 logcat 到 post。谢谢。

型号

public class SubjectsModel
{

    //private long id;
    private String mTitle;
    private String mTeacher;

    public String getmTitle()
    {
        return mTitle;
    }

    public void setmTitle(String title)
    {
        this.mTitle = title;
    }

    public String getmTeacher()
    {
        return mTeacher;
    }

    public void setmTeacher(String teacher)
    {
        this.mTeacher = teacher;
    }
}

片段

public class SubjectsFrag extends DialogFragment implements
        SubjectsEditor.OnAddSubjectListener
{
    private static final String TAG = SubjectsFrag.class.getSimpleName();

    @NonNull
    Context context;
    private EditText titleView, teacherView;
    private String sTitle, sTeacher;
    public EmptyRecyclerView recyclerView;
    public RecyclerView.LayoutManager layoutManager;
    public RecyclerSubAdapter recyclerSubAdapter;
    public ArrayList<SubjectsModel> subMod = new ArrayList<>();
    DbHelper helper;
    @BindView(R.id.main_root)
    ViewGroup root;

    public SubjectsFrag() {
    }

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

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_subjects, container, false);

        FloatingActionButton fab = view.findViewById(R.id.fab_sub);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                showDialog();
            }
        });

        helper = new DbHelper(getActivity());
        helper.getSubject();

        titleView = view.findViewById(R.id.edit_subject);
        teacherView = view.findViewById(R.id.edit_subject_teacher);

        View emptyView = view.findViewById(R.id.empty_subject_view);

        recyclerView = view.findViewById(R.id.recycler_view);
        recyclerView.setHasFixedSize(true);


        recyclerSubAdapter = new RecyclerSubAdapter(getContext(), subMod);

        layoutManager = new LinearLayoutManager(getActivity());
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setAdapter(recyclerSubAdapter);

        return view;
    }

    @Override
    public void OnAddSubjectSubmit(String title, String teacher)
    {
        SubjectsModel model = new SubjectsModel();

        model.setmTitle(title);
        model.setmTeacher(teacher);

        //subMod.clear();
        subMod.add(model);
        recyclerSubAdapter.setData(subMod);

        recyclerSubAdapter.notifyDataSetChanged();

    }

    private void showDialog()
    {
        SubjectsEditor addSubjectDialog = new SubjectsEditor();
        addSubjectDialog.setTargetFragment(this, 0);
        addSubjectDialog.show(getFragmentManager(), null);

    }
}

适配器

public class RecyclerSubAdapter extends RecyclerView.Adapter<RecyclerSubAdapter.ViewHolder>
{
    private static final String TAG = RecyclerSubAdapter.class.getSimpleName();

    public List<SubjectsModel> subMod = new ArrayList<>();
    private OnItemClicked onClick;
    static ClickListener clickListener;
    Context context;
    DbHelper helper;

    public RecyclerSubAdapter(Context context, ArrayList<SubjectsModel> subMod)
    {
        this.context = context;
        this.subMod = subMod;
        this.helper = new DbHelper(context);
    }

    @NonNull
    @Override
    public RecyclerSubAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
    {
        LayoutInflater inflater = LayoutInflater.from(context);
        View view = inflater.inflate(R.layout.subjects_item_list, parent, false);

        ViewHolder viewHolder = new ViewHolder(view);

        return viewHolder;
    }

    @Override
    public void onBindViewHolder(final RecyclerSubAdapter.ViewHolder holder, final int position)
    {
       SubjectsModel currentSubject = subMod.get(position);

        holder.titleView.setText(currentSubject.getmTitle());
        holder.teacher.setText(currentSubject.getmTeacher());

        //helper.addClass(subMod.get(position));
    }

    public class ViewHolder extends RecyclerView.ViewHolder implements
            View.OnClickListener
    {
        TextView titleView;
        TextView teacher;
        CardView cardView;

        public ViewHolder(View itemView)
        {
            super(itemView);
            titleView = itemView.findViewById(R.id.subject_subject);
            teacher = itemView.findViewById(R.id.subject_teacher_text);
            cardView = itemView.findViewById(R.id.card_view);

        }

        @Override
        public void onClick(View view)
        {
            if (clickListener != null)
            {
            }
        }
    }

    @Override
    public int getItemCount()
    {
        if (subMod == null)
        {
            Log.d(TAG, "sub is null");
        }
        return subMod.size();
    }

    @Override
    public long getItemId(int position)
    {
        return position;
    }

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

    public interface OnItemClicked
    {
        void onItemClick(int position);
    }

    public void setOnClick(OnItemClicked onClick)
    {
        this.onClick = onClick;
    }

    public void setClickListener(ClickListener clicked)
    {
        RecyclerSubAdapter.clickListener = clicked;
    }

    public interface ClickListener
    {
        void itemClicked(SubjectsModel model, int position);
    }

    public void setData(ArrayList<SubjectsModel> data)
    {
            this.subMod = data;
            //this.subMod.clear();
            this.subMod.addAll(data);
            notifyDataSetChanged();
    }
}

XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/main_root">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <com.example.ashleighwilson.schoolscheduler.adapter.EmptyRecyclerView
            android:id="@+id/recycler_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginTop="60dp"/>

    </LinearLayout>

   <RelativeLayout
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_centerInParent="true">

    <TextView
        android:id="@+id/empty_subject_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:visibility="gone"
        android:text="@string/no_subjects"/>

   </RelativeLayout>

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab_sub"
        style="@style/FAB" />

</RelativeLayout>

OnAddSubjectSubmit() 你调用 subMod.add(model);
然后你调用 recyclerSubAdapter.setData(subMod);,后者又调用 this.subMod.addAll(data);
自己检查一下。我相信您可以在那里添加两次新项目。
建议:注释掉recyclerSubAdapter.setData(subMod); from OnAddSubjectSubmit().

       this.subMod = data;

       this.subMod.addAll(data);

您通过将 data 分配给它来初始化 subMod,稍后您再次添加数据:this.subMod.addAll(data);