ListView替换第一个对象而不是添加新对象

时间:2017-07-05 21:59:33

标签: android listview

我创建了一个测试项目,在该项目中,我尝试创建一个用户可以在单击按钮时添加的列表视图。该按钮打开一个带有editText的新活动,另一个按钮返回listview活动,并且应该添加一个项目。它第一次工作,但是当我添加另一个项目时,它会替换旧项目。我现在已经搜索了一段时间,所有其他答案似乎都没有帮助我。提前谢谢。

public class MainActivity extends Activity {

ListView simpleList;
String input;
ArrayList<Item> listItems =new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    simpleList = (ListView) findViewById(R.id.listView);
    addData();
    MyAdapter myAdapter=new MyAdapter(this,R.layout.row, listItems);
    simpleList.setAdapter(myAdapter);
}

public void addData(){
    Bundle extras = getIntent().getExtras();
    if (extras != null) {
        input = extras.getString("Homework");
        listItems.add(new Item(input, input, input));
    }
}

public void toInput(View view){
    Intent intent = new Intent(this, inputScreen.class);
    startActivity(intent);
}}

这是我的主要活动,适配器是在此类中创建的自定义适配器。

public class MyAdapter extends ArrayAdapter<Item> {
ArrayList<Item> listItems = new ArrayList<>();

public MyAdapter(Context context, int textViewResourceId, ArrayList<Item> objects){
    super(context, textViewResourceId, objects);
    listItems = objects;
}

public int getCount(){
    return super.getCount();
}

public View getView(int position, View convertView, ViewGroup parent){
    View v = convertView;
    LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    v = inflater.inflate(R.layout.row, null);
    TextView textView = (TextView) v.findViewById(R.id.homeworkDisplay);
    TextView textView2 = (TextView) v.findViewById(R.id.dueDisplay);
    TextView textView3 = (TextView) v.findViewById(R.id.classDisplay);
    textView.setText(listItems.get(position).getHomework());
    textView2.setText(listItems.get(position).getDate());
    textView3.setText(listItems.get(position).getClasses());
    return v;
}}

添加到listview的字符串是从另一个从editText获取它的活动发送的,这是它的类

public class inputScreen extends Activity{

EditText userInput;


public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.input_screen);
    userInput = (EditText) findViewById(R.id.editText);


}

public void sendInfo(View view){
    Intent goingBack = new Intent(this,MainActivity.class);
    goingBack.putExtra("Homework", userInput.getText().toString());
    startActivity(goingBack);

}}

我知道那里有很多代码,你不需要经历所有代码,因为我确定问题出在MainActivity中。我有另一个叫做返回作业的项目。谢谢!

2 个答案:

答案 0 :(得分:0)

撰文:https://stackoverflow.com/users/2936153/rohit5k2

来源: Listview replaces first item instead of creating new items

  

每次调用changeText()时,您的适配器都会被重置,因此只有一个   项目将显示

     

像这样更改你的片段

public class ListViewFragment1 extends Fragment {

protected ArrayAdapter<String> adapter1;
ListView list1;

@Override
public View onCreateView(LayoutInflater inflater,
        @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.list_view_fragment1, container, false);       
    adapter1 = new ArrayAdapter<String>(getActivity(), R.layout.items);
    list1 = (ListView) view.findViewById(R.id.listview1);
    list1.setAdapter(adapter1);
    return view;
}

public void changeText(String data){
    adapter1.add(data);
    adapter1.notifyDataSetChanged();
}
}

答案 1 :(得分:0)

使用的startActivity()不正确。 你的活动堆栈是这样的:

开始 ~~~~~~~~~~~~ 主要活动 ~~~~~~~~~~~~

在MainActivity()

中调用输入后

~~~~~~~~~~~~ InputScreen(活动) 主要活动 ~~~~~~~~~~~~

然后在InputScreen中调用send()

~~~~~~~~~~~~ 主要活动 InputScreen 主要活动 ~~~~~~~~~~~~

看看发生了什么?

在InputScreen中第一次调用send(),使用extras

启动MainActivity

然后你开始了一个新的MainActivity,然后去了addData(),得到了数据,并改变了listView。

但是当你再次这样做时,你总是开始新的活动,所以只有第一个会改变

始终重复第一步始终开始新活动

你应该在MainActivity中调用startActivityForResult()来启动inputScreen并覆盖MainActivity中的onActivityResult方法

只需谷歌startActivity和startActivityForResult,你就可以解决这个问题。 和goher关键词你应该google,listView - &gt;数据来源

抱歉,我不是母语为英语的人,如果我做错了什么,请原谅我~~~~