Как сделать так, чтобы реселлер просматривал загрузку всех видов товаров - PullRequest
0 голосов
/ 27 августа 2018

У меня есть просмотрщик, который загружает до 30 и более элементов. В каждом элементе просмотра есть текст редактирования, позволяющий пользователю вводить некоторые данные и кнопка сохранения.Внутри кнопки сохранения onclick

for (i in 0 until count){ //count = myRecycler.layoutmanager.itemcount
val view = myRecycler.layoutmanager!!..findViewByPosition(i)
val input: EditText = view!!.findViewById(R.id.input)
list.add(input.text.toString())
} 

Это происходит для каждого вида элемента по позиции. Но поскольку просмотр повторного просмотра просто загружает элементы, которые соответствуют экрану, он дает нулевой указатель на значение представления для элементов, находящихся вне экрана.Любое решение, чтобы это произошло Решение, которое я получил - добавить кнопку «Сохранить» в каждый элемент, чтобы при вводе данных пользователь нажимал кнопку «Сохранить» и так далее.Но это не то, что мне нужно

Ответы [ 3 ]

0 голосов
/ 27 августа 2018

Используйте TextWatcher для каждого EditText и получайте обратные вызовы всякий раз, когда их текст был изменен, и сохраняйте текст следующим образом:

editText.addTextChangedListener(object : TextWatcher
        {
            override fun afterTextChanged(s: Editable?) {
               //Save your string here

            }

            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
            }

            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
            }

        })
0 голосов
/ 27 августа 2018

Но это не то, что мне нужно хорошо, нужно вам это или нет, не имеет значения.Вот как работает RecyclerView.Значение, введенное в EditText одного элемента, должно быть сохранено в адаптере, а затем необходимо вызвать notifyItemChanged(), иначе оно будет потеряно после прокрутки.Это относится ко всем изменениям, которые вы вносите в элемент RecyclerView.Если вы сохраните все изменения в адаптере, то можете переходить по элементам адаптера, а не напрямую по элементам RecyclerView, и это не вызовет никаких ошибок.

0 голосов
/ 27 августа 2018

Я бы посоветовал вам вызвать обратный вызов для каждого потерянного фокуса editText через setOnFocusChangeListener, чтобы обновить список данных в имеющейся у вас операции или фрагменте.Код в RecyclerView.Adapter

interface Calllback{
    function updateValue(int position, String value)
}

@Override
public void onBindViewHolder(myViewHolder holder, int position) {

    ...
    holder.editText.setOnFocusChangeListener(new OnFocusChangeListener() {          
        public void onFocusChange(View v, boolean hasFocus) {
            if(!hasFocus) {
                callback.updateValue(holder.getAdapterPosition(), ((EditText)v).getText().toString());
            }
        }
    });
    ...
}

и в действии, которое реализует интерфейс обратного вызова,

class MainActivity extends AppCompatActivity implements Callback{

    private String data = new String[30];

    ...

    @Override
    function updateValue(int position, String value){
        data[position] = value;
    }

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