Android 添加新行时,将清除所有ListView项

Android 添加新行时,将清除所有ListView项,android,android-layout,listview,android-adapter,Android,Android Layout,Listview,Android Adapter,我有一个包含复选框和EditText字段的列表项的自定义布局。点击Add(添加)按钮后,虽然会添加一个新项目,但列表会被清除。所有以前的数据都会消失。我是android新手,所以请告诉我哪里出了问题 以下是我的主要活动: public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(sa

我有一个包含复选框和EditText字段的列表项的自定义布局。点击Add(添加)按钮后,虽然会添加一个新项目,但列表会被清除。所有以前的数据都会消失。我是android新手,所以请告诉我哪里出了问题

以下是我的主要活动:

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //  ArrayList for items
    final ArrayList<Item> itemArrayList = new ArrayList<>() ;

    // CheckBox and EditText
    CheckBox checkBox = (CheckBox) findViewById(R.id.default_checkbox) ;
    EditText editText = (EditText) findViewById(R.id.default_edit_text) ;

    //  Add Button
    Button addButon = (Button) findViewById(R.id.add_button);

    // Item Adapter
    final ItemAdapter itemAdapter = new ItemAdapter(this, itemArrayList) ;

    // ListView Object
    final ListView listView = (ListView) findViewById(R.id.list) ;

    // Set Adapter
    listView.setAdapter(itemAdapter);

    // Setting the onClick Listener
    addButon.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            CheckBox cBox = new CheckBox(MainActivity.this);
            //EditText eText = new EditText(MainActivity.this) ;

            itemArrayList.add(new Item(cBox, "")) ;
            itemAdapter.notifyDataSetChanged() ;
        }
    });
}
}
试试这个。 在适配器中添加此方法

public void addNewItem(Item item)
{
    itemsArrayList.add(item);
}
现在添加新项目,如下所示,点击按钮

itemAdapter.add(new Item(cBox, eText.getText().toString())) ;
itemAdapter.notifyDataSetChanged() ;
试试这个。 在适配器中添加此方法

public void addNewItem(Item item)
{
    itemsArrayList.add(item);
}
现在添加新项目,如下所示,点击按钮

itemAdapter.add(new Item(cBox, eText.getText().toString())) ;
itemAdapter.notifyDataSetChanged() ;

调用此方法时,将向传递给适配器的列表中添加一个新项

itemArrayList.add(new Item(cBox, eText.getText().toString())) ;
        itemAdapter.notifyDataSetChanged() ;
现在,您不是在适配器内部初始化列表引用,而是将其传递给父类

在适配器构造函数中添加此行

this.itemsArrayList = items;

就是这样。

调用此方法时,您正在向传递给适配器的列表中添加一个新项

itemArrayList.add(new Item(cBox, eText.getText().toString())) ;
        itemAdapter.notifyDataSetChanged() ;
现在,您不是在适配器内部初始化列表引用,而是将其传递给父类

在适配器构造函数中添加此行

this.itemsArrayList = items;

就这样。

谢谢你的帮助,但它仍然不起作用。我无法理解这个问题…因此,我更详细地检查了您的代码,注意到您正在列表中添加视图,而不是数据,这不应该这样做,您应该为edittext创建一组新的数据,例如复选框状态和文本,而不是视图本身,只有这样,状态才会保持。好吧,我按照你说的做了……但是当我按下添加按钮或按下手机的后退软键时,所有的行仍然会被清除……请在这里更新你的代码,否则我将帮不上什么忙。抱歉,花了这么多时间……新项目现在只接受空字符串,而不是整个视图。还是没什么区别:/谢谢你的帮助,但还是不起作用。我无法理解这个问题…因此,我更详细地检查了您的代码,注意到您正在列表中添加视图,而不是数据,这不应该这样做,您应该为edittext创建一组新的数据,例如复选框状态和文本,而不是视图本身,只有这样,状态才会保持。好吧,我按照你说的做了……但是当我按下添加按钮或按下手机的后退软键时,所有的行仍然会被清除……请在这里更新你的代码,否则我将帮不上什么忙。抱歉,花了这么多时间……新项目现在只接受空字符串,而不是整个视图。仍然没有区别:/