我正在尝试动态添加和删除ListView
中的行元素。
ListView
中的每个元素都是LinearLayout
。我可以添加和删除行,但每当我这样做时,行的顺序是混乱的,并且不一定删除正确的行。我已检查每次添加行时ArrayList<LinearLayout> rows
的大小都在增加,但对getItem(position)
的调用始终为null。我认为这会导致问题,但为什么将空布局添加到rows
?
编辑:我将ArrayAdapter参数从LinearList更改为Row,这是一个包含两个EditText字段的getter和setter的简单对象。这已经修复了null问题,但仍然存在相同的问题 - 删除随机行。在下面的getView()
中,Logcat会在我的删除按钮position = 0
的每种情况下显示onClick()
。 Logcat还显示ListView中的每个View都被随机分配了一个位置。
我的新适配器代码:
public class RowAdapter extends ArrayAdapter<Row>{
private ArrayList<Row> rows;
public RowAdapter(Context context, int textViewResourceId, ArrayList<Row> rows) {
super(context, textViewResourceId, rows);
this.rows = rows;
}
public Row getItem(int position){
return rows.get(position);
}
public int getCount(){
return rows.size();
}
public static class ViewHolder {
public EditText name;
public EditText value;
public Button delete;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
ViewHolder viewHolder;
if(v == null){
LayoutInflater li = (LayoutInflater)getContext().
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = li.inflate(R.layout.row, parent, false);
viewHolder = new ViewHolder();
viewHolder.name = (EditText)v.findViewById(R.id.editAttrName);
viewHolder.value = (EditText)v.findViewById(R.id.editAttrValue);
viewHolder.delete = (Button)v.findViewById(R.id.btnDelete);
viewHolder.delete.setTag(position);
viewHolder.delete.setOnClickListener(new AdapterView.OnClickListener() {
@Override
public void onClick(View v) {
int position = (Integer) v.getTag();
Log.e("RowAdapter", "position = " + position);
Row row = getItem(position);
rows.remove(row);
notifyDataSetChanged();
}
});
v.setTag(viewHolder);
} else {
viewHolder = (ViewHolder)v.getTag();
}
Log.e("RowAdapter", "row " + v.toString() + ", position = " + position);
Row row = getItem(position);
if(row != null) {
EditText editText1 = (EditText)v.findViewById(R.id.editAttrName);
EditText editText2 = (EditText)v.findViewById(R.id.editAttrValue);
String text1 = editText1.getText().toString();
String text2 = editText2.getText().toString();
if(viewHolder.name != null) {
viewHolder.name.setText(text1);
}
if(viewHolder.value != null) {
viewHolder.value.setText(text2);
}
}
return v;
}
}
答案 0 :(得分:1)
您的问题可能是适配器包含模型的列表,而不是视图列表。视图应由getView()
方法生成。所以你真正想要的是创建一个代表一行的Row
类,然后你可以膨胀并填充getView()
内的视图。
答案 1 :(得分:1)
我认为您不需要创建函数public Row getItem(int position)
,因为ArrayAdapter<T>
提供了一个名为getItemAtPosition(int position)
的内置函数。另外,请确保在您致电getItemAtPosition(int position)
时,活动视图是列表视图,或者您可以处理列表视图,这样您就可以view.getItemAtPosition(position)
,否则您将获得null
。< / p>