所以我有一个基本行,它是在创建列表视图的行时在开头显示的基本模板,但每行都有一个按钮,用于向列表视图中单击的行添加新元素,例如添加一个EditText的问题是,每次我向下滚动然后回到我添加的东西的行,它会再次创建,我添加的元素将被删除。我知道这种情况正在发生,因为我的应用程序每次显示行时都调用方法getView()
,并且使用R.layout.listview_row再次实例化视图,这是我拥有基本行模板的地方。所以我想知道如何确保行中的元素被保存。
这是我的适配器:
public class ListAdapter extends BaseAdapter {
private final Activity context;
ArrayList<String> mDataSet;
public ListAdapter(Activity context, ArrayList<String> mDataSet){
super();
this.context=context;
this.mDataSet = mDataSet;
}
@Override
public int getCount() {
return mDataSet.size();
}
@Override
public Object getItem(int i) {
return mDataSet.get(i);
}
@Override
public long getItemId(int i) {
return mDataSet.get(i).hashCode();
}
@NonNull
@Override
public View getView(final int position, @Nullable final View convertView, @NonNull ViewGroup parent) {
LayoutInflater inflater=context.getLayoutInflater();
final View rowView= inflater.inflate(R.layout.listview_row, null,true);;
TextView exercise_text = (TextView) rowView.findViewById(R.id.exercise_text);
exercise_text.setText(mDataSet.get(position));
Button btnEliminarRow = (Button) rowView.findViewById(R.id.btnEliminarRow);
btnEliminarRow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mDataSet.remove(position);
notifyDataSetChanged();
}
});
Button btnNuevaRow = (Button) rowView.findViewById(R.id.btnNuevaRow);
btnNuevaRow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
addView(rowView);
}
});
addView(rowView);
return rowView;
}
// Helpers
public void addView(View view) {
final LinearLayout ll = (LinearLayout) view.findViewById(R.id.layout_sets);
LayoutInflater inflater = (LayoutInflater) view.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final View v = inflater.inflate(R.layout.exercise_row , null);
Button moreOptions = (Button) v.findViewById(R.id.moreOptions);
ll.addView(v);
moreOptions.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ll.removeView(v);
}
});
}
}
正如你在getView中看到的那样,我有一个监听器,在每次单击按钮时我调用addView方法,这个方法会膨胀一个xml,其中包含一些我想要添加到创建的基本行的新元素。我说的问题是,每次重新加载视图时都会调用getView()
,我添加的元素被覆盖,布局再次将视图膨胀为起始状态。我已尝试使用if并检查convertview是否为null然后再次不会使视图膨胀,但这似乎不起作用,因为它就像转换视图被重用并因此被调用多次查看相同视图的addView()
。
答案 0 :(得分:0)
您应该向数据集添加一个新项目,并通过notifyDataSetChanged
通知适配器。另外,我将实现视图持有者模式。
现在,回到您的代码,您应该实现一个名为addItem(String item)
的方法,该方法将元素添加到mDataSet
。之后,您通知适配器。
类似的东西:
public void addItem(String item) {
if (mDataSet == null) mDataSet = new ArrayList<>();
mDataSet.add(item);
notifyDataSetChanged();
}
之后,改进getView()
方法以使用ViewHolder Pattern和example。