我正在使用带有自定义适配器的自定义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;
}
感谢那些想帮助我的人,我只是不想丢失列表中任何字段中的文本。
答案 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
清楚地说明了