Проблемы с пользовательским ListView с EditText в нем - PullRequest
0 голосов
/ 18 апреля 2019

Я работаю с пользовательским ListView с пользовательским адаптером, который имеет только EditText и TextView в каждой строке, проблема в прокрутке, например, когда в первой строке есть что-то, не имеет значения, как долго текст в поле, если он выходит за пределы экрана во время прокрутки, то, если я возвращаюсь к нему, он теряет текст, который у него был

@Override
public View getView(int i, View view, ViewGroup viewGroup) {
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View itemView = inflater.inflate(R.layout.campos, viewGroup, false);
    TextView tv= itemView.findViewById(R.id.lblNumeroCampo);
    EditText txtCampo = itemView.findViewById(R.id.txtCampo);
    txtCampo.setText(elementos.get(i));
    tvNumero.setText("" + (i +1));
    return itemView;
}

Я просто хочу не потерять текст, который есть в любом поле списка, спасибо тем, кто хочет мне помочь.

Ответы [ 2 ]

0 голосов
/ 18 апреля 2019

Это происходит потому, что android вызывает getView () каждый раз, когда представление выходит из видимого пространства и появляется снова. Поскольку вы создаете новое представление в своем методе getView (), переработка не происходит. Каждый раз, когда вызывается метод getView (), возвращается новое представление без текста.

Как уже упоминалось @tommybee, вы можете использовать класс держателя представления, который проверяет, было ли представление уже инициализировано, и возвращает инициализированное представление, если оно было вызвано.

В качестве альтернативы я бы предложил вам использовать RecyclerView вместо ListView, что делает использование шаблона ViewHolder обязательным. Причина объяснена ясно здесь

0 голосов
/ 18 апреля 2019

Я думаю, вам не нужно вызывать findViewById каждый раз, когда срабатывает действие getview.

Вы также можете использовать holder class.

Ваши классы пользовательского интерфейса должны вызываться один раз, когда класс представления является нулевым.Класс представления может сохранить класс держателя с помощью метода setTag, а затем повторно использовать его с помощью getTag.

Вот мое предложение.

class ViewHolder
{
    TextView tvNumero;
    EditText txtCampo;
}

public View getView(int position, View view, ViewGroup viewGroup) {

    ViewHolder holder;

    if(view == null)
    {
        view = inflater.inflate(resource, viewGroup, false);

        holder = new ViewHolder();
        holder.tvNumero= view.findViewById(R.id.lblNumeroCampo);
        holder.txtCampo = view.findViewById(R.id.txtCampo);

        view.setTag(holder);
    } else {
        holder = (ViewHolder) view.getTag();
    }

    holder.txtCampo.setText(elementos.get(i));
    holder.tvNumero.setText("" + (i +1));

    return view;
}

Иметь хорошее кодирование.

...