#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
andACTION_UP
one
? Пожалуйста, поймите, даже если английский неудобный2. Когда вы нажимаете клавишу ввода, происходит 2 события. Вы нажимаете клавишу ввода, и как только вы поднимаете палец вверх, происходит действие освобождения. Итак, есть 2 события.
3. я хорошо понял. Спасибо 🙂