Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android RowAdapter是否删除动态添加到ListView的随机行?_Android_Listview_Android Linearlayout_Android Adapter - Fatal编程技术网

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

感谢您的回复!我将尝试一下,并让您知道它是如何进行的。我已经实现了您建议的更改,但我仍然遇到类似的问题。我将更新问题以反映这些更改。嗯……我快速查看了您的代码,您没有使用new
Row
object anywhere。但是,您说它“包含两个EditText字段的getter和setter”,这是错误的。同样,您不应该存储实际的EditText,您需要存储纯字符串值。请参阅。我在扩大视图后使用新行(如果适用)。我应该更清楚,Row对象确实存储纯字符串文本。我尝试获取用户在视图中键入的任何字符串,然后将其存储在Row对象中。我将看一看该示例。感谢您迄今为止的帮助!感谢您的回复。我不确定这是否是我想要的,因为没有getItemAtPosition()返回视图(在本例中,ListView包含LinearLayouts)?我认为需要更新ArrayList,然后通知适配器我的数据集已更改