我创建了一个测试项目,在该项目中,我尝试创建一个用户可以在单击按钮时添加的列表视图。该按钮打开一个带有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中。我有另一个叫做返回作业的项目。谢谢!
答案 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;数据来源
抱歉,我不是母语为英语的人,如果我做错了什么,请原谅我~~~~