Я не знаю, почему этот метод вызывается дважды

#java #android #android-recyclerview #android-dialogfragment

#java #Android #android-recyclerview #android-dialogfragment

Вопрос:

Я создаю функцию, которая выводит пустое диалоговое окно и вводит комментарии.

Диалоговое окно состоит из RecyclerView .

И элементы состоят из EditText .

Можно ввести только одну строку комментариев.

Нажатие EnterKey динамически создает поле ввода следующего комментария.

Однако, когда я нажимаю клавишу ввода, two items создаются.

Используя Toast message , я заметил, что OnAddComment() это было вызвано дважды.

Даже после отладки я не уверен, почему их два.

В чем проблема?

writing_comment_item.xml

 <EditText
    android:id="@ id/comment_edit"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="12dp"
    android:gravity="center_vertical"
    android:drawableLeft="@drawable/ic_bullet_point"
    android:drawablePadding="5dp"
    android:layout_marginHorizontal="10dp"
    android:background="@null"
    android:textSize="15sp"
    android:inputType="text"
    android:maxLines="1"
    android:maxLength="22"
    android:imeOptions="actionNone"/>
 

WritingCommentDialogFragment.java

 public class WritingCommentDialogFragment extends DialogFragment {
    List<String> items;
    WritingCommentAdapter commentAdapter;
    RecyclerView comment_rv;
    LinearLayoutManager layoutManager;
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_writing_comment_dialog, container, false);

        initViews(view);
        prepareForRecyclerView();
        commentAdapter.setOnWrtingCommentListener(new WritingCommentAdapter.OnWritingCommentListener() {
            @Override
            public void OnAddComment(int pos) {
                items.add("TEST");
                commentAdapter.addItems(items, pos);
            }
        });

        return view;
    }

    @NonNull
    @Override
    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
        Dialog dialog = super.onCreateDialog(savedInstanceState);
        dialog.setCanceledOnTouchOutside(false);
        return dialog;
    }

    @Override
    public void onResume() {
        super.onResume();
        setDialogSize();
    }
    private void setDialogSize() {
        getDialog().getWindow().setLayout(1000, 1000);
    }

    private void initViews(View view) {
        comment_rv = view.findViewById(R.id.comment_rv);
    }

    private void prepareForRecyclerView() {
        commentAdapter = new WritingCommentAdapter();
        layoutManager = new LinearLayoutManager(getContext(), RecyclerView.VERTICAL, true);
        comment_rv.setLayoutManager(layoutManager);
        comment_rv.setAdapter(commentAdapter);
        items = new ArrayList<>();
        items.add(null);
        commentAdapter.addItem(items);
    }
}
 

Adapter.java

 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);
    }
}
 

введите описание изображения здесь

Комментарии:

1. Вы проверили значения actionId и event для двух вызовов? Отличаются ли они?

2. Нет, я это не проверял. В результате проверки значение actionId равно 0 , и я не знаю value of event . Похоже, что значение отображается неправильно. Я опубликую картинку.

3. Он получает обратный вызов 2 раза. Один для действия ACTION_DOWN и один для действия ACTION_UP, когда он нажимает кнопку ввода.

4. if(слушатель!= null) { if( event.getAction() == KeyEvent . ACTION_DOWN) { слушатель. OnAddComment(getAdapterPosition()); } }

5. конечно, пожалуйста, задайте свой запрос

Ответ №1:

Он получает обратный вызов 2 раза. Один для действия ACTION_DOWN и один для действия ACTION_UP , когда он нажимает кнопку ввода.

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

Поэтому добавляйте комментарии только тогда, когда выполняется действие ACTION_DOWN .

Комментарии:

1. вопрос, который вы пытались задать, был решен, и это вопрос вашего ответа. Согласно вашему ответу, EnterKey на Android это действия ACTION_DOWN and ACTION_UP one ? Пожалуйста, поймите, даже если английский неудобный

2. Когда вы нажимаете клавишу ввода, происходит 2 события. Вы нажимаете клавишу ввода, и как только вы поднимаете палец вверх, происходит действие освобождения. Итак, есть 2 события.

3. я хорошо понял. Спасибо 🙂