Android RowAdapter是否删除动态添加到ListView的随机行?
我正在尝试从Android RowAdapter是否删除动态添加到ListView的随机行?,android,listview,android-linearlayout,android-adapter,Android,Listview,Android Linearlayout,Android Adapter,我正在尝试从列表视图中动态添加和删除行元素 列表视图中的每个元素都是线性布局。我可以添加和删除行,但无论何时添加或删除,行的顺序都是混乱的,不一定删除正确的行。我检查了我的ArrayList行在每次添加行时的大小是否都在增加,但是对getItem(position)的调用始终为空。我认为这是问题的根源,但为什么要将空布局添加到行中 Edit:我将ArrayAdapter参数从LinearList更改为Row,这是一个简单的对象,包含两个EditText字段的getter和setter。这已经修复
列表视图
中动态添加和删除行元素
列表视图中的每个元素都是线性布局
。我可以添加和删除行,但无论何时添加或删除,行的顺序都是混乱的,不一定删除正确的行。我检查了我的ArrayList行
在每次添加行时的大小是否都在增加,但是对getItem(position)
的调用始终为空。我认为这是问题的根源,但为什么要将空布局添加到行中
Edit:我将ArrayAdapter参数从LinearList更改为Row,这是一个简单的对象,包含两个EditText字段的getter和setter。这已经修复了空问题,但仍然存在相同的问题-删除随机行。在下面的getView()
中,Logcat在我的删除按钮onClick()的每种情况下都显示position=0
。Logcat还显示ListView中的每个视图都被随机分配了一个位置
我的新适配器代码:
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;
}
}
公共类行适配器扩展了ArrayAdapter{
私有数组列表行;
公共行适配器(上下文上下文、int textViewResourceId、ArrayList行){
超级(上下文、textViewResourceId、行);
this.rows=行;
}
公共行getItem(int位置){
返回行。获取(位置);
}
public int getCount(){
返回rows.size();
}
公共静态类视图持有者{
公共文本名称;
公共文本价值;
公共按钮删除;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图v=转换视图;
持票人持票人;
如果(v==null){
LayoutInflater li=(LayoutInflater)getContext()。
getSystemService(上下文布局\充气机\服务);
v=li.充气(R.布局.行,父级,假);
viewHolder=新的viewHolder();
viewHolder.name=(EditText)v.findViewById(R.id.editAttrName);
viewHolder.value=(EditText)v.findViewById(R.id.editAttrValue);
viewHolder.delete=(按钮)v.findviewbyd(R.id.btnDelete);
viewHolder.delete.setTag(位置);
viewHolder.delete.setOnClickListener(新的AdapterView.OnClickListener(){
@凌驾
公共void onClick(视图v){
int position=(整数)v.getTag();
Log.e(“RowAdapter”、“position=“+position”);
行=获取项目(位置);
行。删除(行);
notifyDataSetChanged();
}
});
v、 setTag(视图持有者);
}否则{
viewHolder=(viewHolder)v.getTag();
}
Log.e(“RowAdapter”、“row”+v.toString()+”,position=“+position”);
行=获取项目(位置);
如果(行!=null){
EditText editText1=(EditText)v.findViewById(R.id.editAttrName);
EditText editText2=(EditText)v.findViewById(R.id.editAttrValue);
字符串text1=editText1.getText().toString();
字符串text2=editText2.getText().toString();
if(viewHolder.name!=null){
viewHolder.name.setText(text1);
}
if(viewHolder.value!=null){
viewHolder.value.setText(text2);
}
}
返回v;
}
}
您的问题可能是适配器应该包含模型列表,而不是视图列表。视图应该由getView()
方法生成。因此,您真正想要的是创建一个表示行的Row
类,然后您可以膨胀并填充getView()
中的视图,我认为您不需要创建函数public Row getItem(int position)
,因为ArrayAdapter
提供了一个名为getItemAtPosition的内置函数(int-position)
。在调用getItemAtPosition(int-position)
时,还要确保活动视图是列表视图,或者您有列表视图的句柄,以便执行view。getItemAtPosition(position)
,否则您将得到null
感谢您的回复!我将尝试一下,并让您知道它是如何进行的。我已经实现了您建议的更改,但我仍然遇到类似的问题。我将更新问题以反映这些更改。嗯……我快速查看了您的代码,您没有使用newRow
object anywhere。但是,您说它“包含两个EditText字段的getter和setter”,这是错误的。同样,您不应该存储实际的EditText,您需要存储纯字符串值。请参阅。我在扩大视图后使用新行(如果适用)。我应该更清楚,Row对象确实存储纯字符串文本。我尝试获取用户在视图中键入的任何字符串,然后将其存储在Row对象中。我将看一看该示例。感谢您迄今为止的帮助!感谢您的回复。我不确定这是否是我想要的,因为没有getItemAtPosition()返回视图(在本例中,ListView包含LinearLayouts)?我认为需要更新ArrayList,然后通知适配器我的数据集已更改