如何以编程方式将元素添加到ListView行?

时间:2017-08-04 04:18:15

标签: android listview

所以我有一个基本行,它是在创建列表视图的行时在开头显示的基本模板,但每行都有一个按钮,用于向列表视图中单击的行添加新元素,例如添加一个EditText的问题是,每次我向下滚动然后回到我添加的东西的行,它会再次创建,我添加的元素将被删除。我知道这种情况正在发生,因为我的应用程序每次显示行时都调用方法getView(),并且使用R.layout.listview_row再次实例化视图,这是我拥有基本行模板的地方。所以我想知道如何确保行中的元素被保存。

这是我的适配器:

public class ListAdapter extends BaseAdapter {

    private final Activity context;

    ArrayList<String> mDataSet;


    public ListAdapter(Activity context, ArrayList<String> mDataSet){
        super();
        this.context=context;
        this.mDataSet = mDataSet;
    }

    @Override
    public int getCount() {
        return mDataSet.size();
    }

    @Override
    public Object getItem(int i) {
        return mDataSet.get(i);
    }

    @Override
    public long getItemId(int i) {
        return mDataSet.get(i).hashCode();
    }

    @NonNull
    @Override
    public View getView(final int position, @Nullable final View convertView, @NonNull ViewGroup parent) {
        LayoutInflater inflater=context.getLayoutInflater();
        final View rowView=  inflater.inflate(R.layout.listview_row, null,true);;

        TextView exercise_text = (TextView) rowView.findViewById(R.id.exercise_text);
        exercise_text.setText(mDataSet.get(position));

        Button btnEliminarRow = (Button) rowView.findViewById(R.id.btnEliminarRow);
        btnEliminarRow.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mDataSet.remove(position);
                notifyDataSetChanged();
            }
        });

        Button btnNuevaRow = (Button) rowView.findViewById(R.id.btnNuevaRow);
        btnNuevaRow.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                addView(rowView);
            }
        });

        addView(rowView);

        return rowView;
    }

    // Helpers

    public void addView(View view) {
        final LinearLayout ll = (LinearLayout) view.findViewById(R.id.layout_sets);

        LayoutInflater inflater = (LayoutInflater)  view.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        final View v =  inflater.inflate(R.layout.exercise_row , null);
        Button moreOptions = (Button) v.findViewById(R.id.moreOptions);

        ll.addView(v);

        moreOptions.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ll.removeView(v);
            }
        });
    }
}

正如你在getView中看到的那样,我有一个监听器,在每次单击按钮时我调用addView方法,这个方法会膨胀一个xml,其中包含一些我想要添加到创建的基本行的新元素。我说的问题是,每次重新加载视图时都会调用getView(),我添加的元素被覆盖,布局再次将视图膨胀为起始状态。我已尝试使用if并检查convertview是否为null然后再次不会使视图膨胀,但这似乎不起作用,因为它就像转换视图被重用并因此被调用多次查看相同视图的addView()

1 个答案:

答案 0 :(得分:0)

您应该向数据集添加一个新项目,并通过notifyDataSetChanged通知适配器。另外,我将实现视图持有者模式。

Here some examples.

现在,回到您的代码,您应该实现一个名为addItem(String item)的方法,该方法将元素添加到mDataSet。之后,您通知适配器。 类似的东西:

public void addItem(String item) {
    if (mDataSet == null) mDataSet = new ArrayList<>();
    mDataSet.add(item);
    notifyDataSetChanged();
}

之后,改进getView()方法以使用ViewHolder Patternexample