Java 我不知道';我不知道为什么这个方法会被调用两次

Java 我不知道';我不知道为什么这个方法会被调用两次,java,android,android-recyclerview,android-dialogfragment,Java,Android,Android Recyclerview,Android Dialogfragment,我正在制作一个功能,弹出一个空对话框并输入评论 该对话框由一个RecyclerView组成 和项目由EditText组成 只能输入一行注释 按EnterKey动态创建下一个注释输入字段 但是,当我按enter键时,会创建两个项目 使用Toast消息,我注意到OnAddComment()被调用了两次 即使在调试之后,我也不确定为什么会有两个 有什么问题吗 编写\u comment\u item.xml 编写CommentDialogFragment.java 公共类WritingComment

我正在制作一个功能,弹出一个空对话框并输入评论

该对话框由一个
RecyclerView
组成

和项目由
EditText
组成

只能输入一行注释

EnterKey
动态创建下一个注释输入字段

但是,当我按enter键时,会创建两个项目

使用
Toast消息
,我注意到
OnAddComment()
被调用了两次

即使在调试之后,我也不确定为什么会有两个

有什么问题吗

编写\u comment\u item.xml


编写CommentDialogFragment.java

公共类WritingCommentDialogFragment扩展DialogFragment{
清单项目;
编写commentAdapter commentAdapter;
回收评论;
直线布局经理布局经理;
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
视图=充气机。充气(R.layout.fragment\u writing\u comment\u对话框,容器,false);
初始视图(视图);
prepareForRecyclerView();
commentAdapter.SetOnWritingCommentListener(新的WritingCommentAdapter.OnWritingCommentListener(){
@凌驾
公共无效OnAddComment(int pos){
项目。添加(“测试”);
附件(项目、位置);
}
});
返回视图;
}
@非空
@凌驾
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState){
Dialog Dialog=super.onCreateDialog(savedInstanceState);
对话框。setCanceledOnTouchOutside(false);
返回对话框;
}
@凌驾
恢复时公开作废(){
super.onResume();
setDialogSize();
}
私有void setDialogSize(){
getDialog().getWindow().setLayout(10001000);
}
私有void initViews(视图){
comment_rv=view.findviewbyd(R.id.comment_rv);
}
私有void prepareForRecyclerView(){
commentAdapter=新建WritingCommentAdapter();
layoutManager=新的LinearLayoutManager(getContext(),RecyclerView.VERTICAL,true);
评论设置布局经理(布局经理);
注释设置适配器(注释适配器);
items=newarraylist();
items.add(空);
1.附件(项目);
}
}
Adapter.java

公共类WritingCommentAdapter扩展了RecyclerView.Adapter{ 列出项目; OnWritingCommentListener监听器; 语境; 公共void设置OnWritingCommentListener(OnWritingCommentListener侦听器){ this.listener=listener; } 公共无效附加项(列表项){ 注释项目=项目; } 公共无效附加项(列表项、int pos){ 注释项目=项目; 已插入的项目(pos); } @非空 @凌驾 public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType){ context=parent.getContext(); View itemView=LayoutFlater.from(parent.getContext()).flate(R.layout.writing\u comment\u item,parent,false); 返回新的ViewHolder(itemView); } @凌驾 public void onBindViewHolder(@NonNull ViewHolder,int位置){ } @凌驾 public int getItemCount(){ 返回commentItems.size(); } 公共类ViewHolder扩展了RecyclerView.ViewHolder{ 编辑文本评论; 公共视图持有者(@NonNull View itemView){ 超级(项目视图); comment=itemView.findviewbyd(R.id.comment\u edit); comment.setOnEditorActionListener(新的TextView.OnEditorActionListener(){ @覆盖//输入法选项无(输入键) 公共布尔onEditorAction(TextView v、int actionId、KeyEvent事件){ if(侦听器!=null){ OnAddComment(getAdapterPosition()); } 返回true; } }); } 公共void集合项(字符串str){ setText(str); } } 公共接口OnWritingCommentListener{ 公开无效评论(int pos); } }

它正在接收两次回调。当他按下回车按钮时,一个用于动作
动作向下
,一个用于动作
动作向上

if(listener != null) { if( event.getAction() == KeyEvent.ACTION_DOWN) { listener.OnAddComment(getAdapterPosition()); } } 

因此,仅当操作是
action\u DOWN

时才添加注释,因为它会收到两次回调。当他按下回车按钮时,一个用于动作
动作向下
,一个用于动作
动作向上

if(listener != null) { if( event.getAction() == KeyEvent.ACTION_DOWN) { listener.OnAddComment(getAdapterPosition()); } } 

因此,仅当操作为
action\u DOWN

时才添加注释。您是否检查了这两个调用的
actionId
event
的值?它们不同吗?不,我没有检查。作为验证的结果,
actionId
的值为
0
,我不知道事件的
值。该值似乎没有正确显示。我将发布一张图片。它将收到2次回调。当他按下回车按钮时,一个表示动作动作向下,一个表示动作向上。如果(侦听器!=null){if(event.getAction()==KeyEvent.action\u向下){listener.OnAddComment(getAdapterPosition());}确定,请询问您的问题您是否检查了这两个调用的
actionId
event
的值?它们不同吗?不,我没有检查。作为验证的结果,
actionId
的值为
0
,我不知道事件的
值。该值似乎没有正确显示。我将发布一张图片。它将收到2次回调。当他被按下时,一个动作向下,一个动作向上
public class WritingCommentAdapter extends RecyclerView.Adapter<WritingCommentAdapter.ViewHolder> {
    List<String> commentItems;
    OnWritingCommentListener listener;
    Context context;

    public void setOnWrtingCommentListener(OnWritingCommentListener listener) {
        this.listener = listener;
    }

    public void addItem(List<String> items) {
        commentItems = items;
    }

    public void addItems(List<String> items, int pos) {
        commentItems = items;
        notifyItemInserted(pos);
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        context = parent.getContext();
        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.writing_comment_item, parent, false);
        return new ViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
 
    }

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

    public class ViewHolder extends RecyclerView.ViewHolder {
        EditText comment;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            comment = itemView.findViewById(R.id.comment_edit);

            comment.setOnEditorActionListener(new TextView.OnEditorActionListener() {
                @Override // IME Option NONE ( ENTER KEY)
                public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                    if(listener != null) {
                        listener.OnAddComment(getAdapterPosition());

                    }
                    return true;
                }
            });
        }

        public void setItem(String str) {
            comment.setText(str);
        }
    }

    public interface OnWritingCommentListener {
        public void OnAddComment(int pos);
    }
}
if(listener != null) { if( event.getAction() == KeyEvent.ACTION_DOWN) { listener.OnAddComment(getAdapterPosition()); } }