Android listView 在添加新项目时没有得到更新
Android listView doesn't get update when adding new items
我正在尝试创建一个应用程序,您可以在其中将另一个字符串添加到列表中 activity,但每次我将新字符串添加到列表中时,它都会替换旧字符串。
我该如何解决这个问题?
列表所在的代码。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show_list);
Button button = (Button) findViewById(R.id.addBtn);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(ShowList.this, AddToList.class));
}
});
Intent i = getIntent();
Bundle b = i.getExtras();
if(b!=null) {
String textToList = b.getString("listText");
List<String> stuff = new ArrayList<String>();
final ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, stuff);
ListView list = (ListView) findViewById(R.id.listView);
list.setAdapter(adapter);
adapter.add(textToList);
adapter.notifyDataSetChanged();
}
}
xml 文件代码:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".ShowList">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Add"
android:id="@+id/addBtn"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="List:"
android:id="@+id/textView"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/listView"
android:layout_centerHorizontal="true"
android:layout_above="@+id/addBtn"
android:layout_below="@+id/textView" />
您输入文本的文件代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_to_list);
final Bundle b = new Bundle();
final Intent i = new Intent(AddToList.this, ShowList.class);
final EditText text = (EditText)this.findViewById(R.id.listText);
Button btn = (Button) findViewById(R.id.btnAdd);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String s = text.getText().toString();
b.putString("listText", s);
i.putExtras(b);
startActivity(i);
}
});
}
最后是 xml 之前代码和平的代码:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.example.mathias.listapp.AddToList">
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/listText"
android:layout_alignParentTop="true"
android:layout_marginTop="100dp"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:inputType="text"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ADD"
android:id="@+id/btnAdd"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
试试这个,
String textToList = b.getString("listText");
List<String> stuff = new ArrayList<String>();
stuff.add(textToList)
final ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, stuff);
ListView list = (ListView) findViewById(R.id.listView);
list.setAdapter(adapter);
adapter.notifyDataSetChanged();
发生这种情况是因为您每次输入 activity 时都会创建一个新列表。因此,您保存列表的字段必须是 "permanent" 字段。我建议你声明一个静态列表并检查它是否不为空:
您的列表所在的代码:
public class Nameofmyclass{
static List<String> stuff;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show_list);
if(stuff==null){
stuff = new ArrayList<String>();
}
ListView list = (ListView) findViewById(R.id.listView);
Button button = (Button) findViewById(R.id.addBtn);
final ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, stuff);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(ShowList.this, AddToList.class));
}
});
Intent i = getIntent();
Bundle b = i.getExtras();
if(b!=null) {
String textToList = b.getString("listText");
stuff.add(textToList);
}
list.setAdapter(adapter);
}
}
顺便说一下,您的代码中有几个 "problems":
- 您将项目添加到适配器,而不是列表
- 您仅在捆绑包不为空时才初始化列表视图,为什么?你的列表视图每次都会保留,你不需要用这个检查初始化它
- 您在点击之外的其他 class 中创建了最终意图。这在编程上没有错,但在这种情况下没有任何动机需要您这样做。最好像您在第一个 class
中那样在本地单击
我正在尝试创建一个应用程序,您可以在其中将另一个字符串添加到列表中 activity,但每次我将新字符串添加到列表中时,它都会替换旧字符串。
我该如何解决这个问题?
列表所在的代码。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show_list);
Button button = (Button) findViewById(R.id.addBtn);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(ShowList.this, AddToList.class));
}
});
Intent i = getIntent();
Bundle b = i.getExtras();
if(b!=null) {
String textToList = b.getString("listText");
List<String> stuff = new ArrayList<String>();
final ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, stuff);
ListView list = (ListView) findViewById(R.id.listView);
list.setAdapter(adapter);
adapter.add(textToList);
adapter.notifyDataSetChanged();
}
}
xml 文件代码:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".ShowList">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Add"
android:id="@+id/addBtn"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="List:"
android:id="@+id/textView"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/listView"
android:layout_centerHorizontal="true"
android:layout_above="@+id/addBtn"
android:layout_below="@+id/textView" />
您输入文本的文件代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_to_list);
final Bundle b = new Bundle();
final Intent i = new Intent(AddToList.this, ShowList.class);
final EditText text = (EditText)this.findViewById(R.id.listText);
Button btn = (Button) findViewById(R.id.btnAdd);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String s = text.getText().toString();
b.putString("listText", s);
i.putExtras(b);
startActivity(i);
}
});
}
最后是 xml 之前代码和平的代码:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.example.mathias.listapp.AddToList">
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/listText"
android:layout_alignParentTop="true"
android:layout_marginTop="100dp"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:inputType="text"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ADD"
android:id="@+id/btnAdd"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
试试这个,
String textToList = b.getString("listText");
List<String> stuff = new ArrayList<String>();
stuff.add(textToList)
final ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, stuff);
ListView list = (ListView) findViewById(R.id.listView);
list.setAdapter(adapter);
adapter.notifyDataSetChanged();
发生这种情况是因为您每次输入 activity 时都会创建一个新列表。因此,您保存列表的字段必须是 "permanent" 字段。我建议你声明一个静态列表并检查它是否不为空:
您的列表所在的代码:
public class Nameofmyclass{
static List<String> stuff;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show_list);
if(stuff==null){
stuff = new ArrayList<String>();
}
ListView list = (ListView) findViewById(R.id.listView);
Button button = (Button) findViewById(R.id.addBtn);
final ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, stuff);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(ShowList.this, AddToList.class));
}
});
Intent i = getIntent();
Bundle b = i.getExtras();
if(b!=null) {
String textToList = b.getString("listText");
stuff.add(textToList);
}
list.setAdapter(adapter);
}
}
顺便说一下,您的代码中有几个 "problems":
- 您将项目添加到适配器,而不是列表
- 您仅在捆绑包不为空时才初始化列表视图,为什么?你的列表视图每次都会保留,你不需要用这个检查初始化它
- 您在点击之外的其他 class 中创建了最终意图。这在编程上没有错,但在这种情况下没有任何动机需要您这样做。最好像您在第一个 class 中那样在本地单击