【发布时间】:2012-04-03 22:17:24
【问题描述】:
我正在尝试从ListView 动态添加和删除行元素。
ListView 中的每个元素都是一个LinearLayout。我可以添加和删除行,但是每当我这样做时,行的顺序都是混乱的,并且不一定要删除正确的行。我检查了每次添加一行时我的ArrayList<LinearLayout> rows 的大小都会增加,但是对getItem(position) 的调用始终为空。我认为这是导致问题的原因,但为什么将空布局添加到 rows?
Edit:我将 ArrayAdapter 参数从 LinearList 更改为 Row,这是一个包含两个 EditText 字段的 getter 和 setter 的简单对象。这已经解决了 null 问题,但同样的问题仍然存在 - 随机行被删除。在下面的getView() 中,Logcat 在我的删除按钮onClick() 的每种情况下都显示position = 0。 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;
}
}
【问题讨论】:
标签: android listview android-linearlayout android-adapter