带有自定义ListView和EditText的问题

时间:2019-04-18 01:28:50

标签: android android-listview android-edittext

我正在使用带有自定义适配器的自定义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 :(得分:0)

我认为您无需在每次触发getview操作时调用 findViewById

您还可以使用 holder 类。

当视图类为null时,应调用一次您的UI类。 视图类可以使用setTag方法保存holder类,然后通过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;
}

编码良好。

答案 1 :(得分:0)

之所以会这样,是因为每次视图超出可见空间并再次出现时,android都会调用getView()。由于要在getView()方法中创建新视图,因此不会发生回收。每次调用getView()方法时,都会返回一个没有文本的新视图。

正如@tommybee所提到的,您可以使用视图持有者类来检查视图是否已经初始化,并返回已初始化的视图(如果已调用)。

或者,我建议您使用RecyclerView而不是ListView,它使必须使用ViewHolder模式成为可能。原因here

清楚地说明了