Как получить ввод EditText без нажатия кнопки в RecyclerView? - PullRequest
0 голосов
/ 19 мая 2019

Сводка

У меня есть CardView в RecycleView с элементом EditText, и я хотел бы получить пользовательский ввод, не требуя, чтобы он нажимал кнопку или нажимал ввод, и сравнивалэто с предопределенной строкой.

Я перепробовал много уроков, даже ответов в stackOverflow, но, похоже, все еще не работает.Моя идея заключалась в том, чтобы реализовать TextWatcher в моем классе адаптера, чтобы получить входные данные.Ниже приведена моя попытка (если я уберу весь связанный с ним контент EditText, код будет работать нормально).Ниже приведена моя попытка:

Код MyAdapter

public class MyAdapter2 extends RecyclerView.Adapter<MyAdapter2.MyViewHolder>{
private Context mContext;
private List<CardAudioGrid> mList;
private OnItemClickListener mListener;

private int nowPlaying = -1;

private String ans;

public interface OnItemClickListener{
    void onPlayClick (int position);
}


public void setOnItemClickListener(OnItemClickListener listener){
    mListener = listener;
}

public MyAdapter2(Context mContext, List<CardAudioGrid> mList) {
    this.mContext = mContext;
    this.mList = mList;
}

@Override
public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    LayoutInflater inflater = LayoutInflater.from(mContext);
    View view = inflater.inflate(R.layout.audiocard, viewGroup, false);
    //when I try to run the code, it shows the error: ...MyAdapter2.MyViewHolder is not an enclosing class
    return new MyViewHolder(view, mListener, new MyViewHolder.MyCustomEditTextListener());
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
    holder.audioCardBackground.setImageResource(mList.get(position).getCardBackground());
...
    holder.myCustomEditTextListener.updatePosition(holder.getLayoutPosition());
}
@Override
public int getItemCount() {
    return mList.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder{
    ImageView mediaPlayer, audioCardBackground;
    EditText toonName;
    MyCustomEditTextListener myCustomEditTextListener;

    public MyViewHolder(View itemView, final OnItemClickListener listener, MyCustomEditTextListener myCustomEditTextListener) {
        super(itemView);

        itemView.findViewById(R.id.cardbackgroundId);
        ...

        this.myCustomEditTextListener = myCustomEditTextListener;

        mediaPlayer.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(listener!=null){
                    int position = getLayoutPosition();
                    nowPlaying = position;
                    if (position != RecyclerView.NO_POSITION){
                        listener.onPlayClick(position);
                        notifyDataSetChanged(); //restarts the views
                    }else{
                        Toast.makeText(mContext, "error", Toast.LENGTH_LONG);
                    }
                }
            }
        });
    }

    //I want the EditText to watch what the user is typing. Every change should be compared
    //to the names string given from when adding mList items
    private class MyCustomEditTextListener 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) {
            ans = s.toString().toLowerCase();
            if (ans == mList.get(position).getName()){
                Toast.makeText(mContext, "Correct", Toast.LENGTH_LONG);
            }
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    }

}
}

Ошибка моей попытки прокомментирована в приведенном выше коде.Как мне реализовать эту идею?

В настоящее время я изучаю, как правильно управлять андроидом, поэтому я был бы очень признателен, если бы вы объяснили шаги решения.

Ответы [ 3 ]

1 голос
/ 19 мая 2019

Применить это:

toonName.setOnFocusChangeListener((v, hasFocus) -> {
                if (hasFocus) {
                    toonName.removeTextChangedListener(textWatcher);
                    toonName.addTextChangedListener(textWatcher);
                } else {
                    toonName.removeTextChangedListener(textWatcher);
                }
            });
0 голосов
/ 22 мая 2019

Вот код для получения всех данных элемента списка повторного просмотра по нажатию кнопки

 integerArrayList= my array of data which i have passed to adapter

            ArrayList<FormDataItems> formDataItemsArrayList = new ArrayList<>();      
                for (int i = 0; i < integerArrayList.size(); i++) {
                    View view = rvForm.getChildAt(i);
                    EditText etName = (EditText) view.findViewById(R.id.etName);
                    EditText etMobile = (EditText) view.findViewById(R.id.etMobile);
                    RadioGroup rgGender = (RadioGroup) view.findViewById(R.id.rbGender);


                    String strName = etName.getText().toString();
                    String strNumber = etMobile.getText().toString();

                    //add in to array for further use
                    FormDataItems formDataItems = new FormDataItems(strName, gender, strNumber);
                    formDataItemsArrayList.add(formDataItems);

                }

, напишите этот код при нажатии кнопки, и идентификатор элемента такой же, как в ячеистой ячейке recyclerview cell / item.xml

0 голосов
/ 20 мая 2019

внутри onTextChanged()

Использование

ans = s.toString().toLowerCase();
            if (ans.equals(mList.get(position).getName())){
                Toast.makeText(mContext, "Correct", Toast.LENGTH_LONG);
            }
...