У меня есть вид Recycler, к которому прикреплен наблюдатель текста.Любые изменения автоматически сохраняют ввод.То, что я хотел бы сделать, это проверка ошибок в TextWatch.К сожалению, я не уверен, как использовать метод setError () в TextWatcher.Я не могу найти правильный способ ссылки на элемент ViewHolder.Есть ли способ, который делает это простым?Мне известно о getTag и setTag, но я не могу найти примеры, которые правильно используют его в этом сценарии.
Комментируемый блок кода «// проверить, пусто ли слово» работает, только если я помещаю его вконец onBindViewHolder.Это работает только во время выполнения и проверяет только начальные значения.Я хотел бы, чтобы это вызывалось каждый раз, когда текст изменяется для этого конкретного элемента editText.
Есть ли способ сделать это простым решением?
package edu.gatech.seclass.sdpvocabquiz.adapters;
import android.support.v7.widget.RecyclerView;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.TextView;
import java.util.HashMap;
import java.util.List;
import edu.gatech.seclass.sdpvocabquiz.R;
import edu.gatech.seclass.sdpvocabquiz.data.WordPair;
public class WordPairAdapter extends
RecyclerView.Adapter<WordPairAdapter.WordPairHolder> {
private List<WordPair> wordPairs;
private boolean addButtonClicked;
public WordPairAdapter(List<WordPair> wordPairs) {
this.wordPairs = wordPairs;
}
public void setFocusToLastAdded(){
addButtonClicked = true;
}
@Override
public int getItemCount() {
return wordPairs.size();
}
@Override
public void onBindViewHolder(WordPairHolder wordPairHolder, int i) {
// Attaching an event listener to the dynamically created adapter item
// Update our textfields every time we bind a new element via a textListener
// Updating textEdit fields that are dynamically generated with adapters
// Source: https://stackoverflow.com/questions/31844373/saving-edittext-content-in-recyclerview
WordPair wp = wordPairs.get(i);
wordPairHolder.wordListener.updatePosition(i);
wordPairHolder.definitionListener.updatePosition(i);
wordPairHolder.wordEditText.setText(wp.getWord());
wordPairHolder.definitionEditText.setText(wp.getCorrectDefinition());
wordPairHolder.wordEditText.setTag("word" + i);
wordPairHolder.definitionEditText.setTag("def" + i);
}
@Override
public WordPairHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View itemView = LayoutInflater.
from(viewGroup.getContext()).
inflate(R.layout.cardview_word_pair, viewGroup, false);
WordPairHolder wordPairHolder = new WordPairHolder(itemView, new AttachedWordEditTextListener(), new DefinitionEditTextListener());
return wordPairHolder;
}
public static class WordPairHolder extends RecyclerView.ViewHolder {
AttachedWordEditTextListener wordListener;
DefinitionEditTextListener definitionListener;
protected EditText wordEditText;
protected EditText definitionEditText;
public WordPairHolder(View v, AttachedWordEditTextListener wordListener, DefinitionEditTextListener definitionListener) {
super(v);
// Reference our elements
this.wordEditText = (EditText) v.findViewById(R.id.quizWordPairWord);
this.definitionEditText = (EditText) v.findViewById(R.id.quizWordPairDefinition);
// Reference and Attach our text listener
this.wordListener = wordListener;
this.definitionListener = definitionListener;
this.wordEditText.addTextChangedListener(wordListener);
this.definitionEditText.addTextChangedListener(definitionListener);
}
}
private class AttachedWordEditTextListener implements TextWatcher{
private int position;
public void updatePosition(int position){
this.position = position;
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
WordPair wp = wordPairs.get(position);
wp.setWord(s.toString());
//String string = s.toString();
//check if empty for word
// if(wp.getWord().trim().length() == 0 || wp.getWord().isEmpty()){
// wordPairHolder.wordEditText.setError("Cannot be left blank");
// }
//
// // check if empty for word definition
// if(wp.getCorrectDefinition().trim().length() == 0 || wp.getCorrectDefinition().isEmpty()){
// wordPairHolder.definitionEditText.setError("Cannot be left blank");
// }
//
// // Set focus to latest item if added
// if(i == getItemCount()-1){
// Log.i("WordPairAdapter","Item count: " + i + "getItemCount: " + String.valueOf(getItemCount()));
// wordPairHolder.wordEditText.requestFocus();
// }
}
@Override
public void afterTextChanged(Editable s) {
}
}
private class DefinitionEditTextListener implements TextWatcher{
private int position;
public void updatePosition(int position){
this.position = position;
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
WordPair wp = wordPairs.get(position);
wp.setCorrectDefinition(s.toString());
}
@Override
public void afterTextChanged(Editable s) {
}
}
}