Android Recycler Просмотр setError для динамически добавляемых элементов - PullRequest
0 голосов
/ 18 октября 2018

У меня есть вид 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) {

        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...