我有一个回收视图,它有一个文本观察附加到它。任何编辑都会自动保存输入。我想做的是检查文本手表时出错。不幸的是,我不确定如何在TextWatcher中使用seterror()方法。我似乎找不到合适的方法来引用viewholder项。有什么办法可以让这一切变得简单吗?我知道gettag和settag,但是我找不到在这个场景中正确使用它的示例。
下面注释的代码块“//check if empty for word”仅在我将其放在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) {
}
}
}