RowAdapter是否删除动态添加到ListView的随机行?

时间:2012-04-03 22:17:25

标签: android listview android-linearlayout android-adapter

我正在尝试动态添加和删除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;
    }
}

2 个答案:

答案 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>