我的 ListView 在执行第二个更改后更新第一个更改
My ListView updates the first change after doing a second one
我的 MainActivity 中有一个 ListView 和一个 'add' 按钮。按下按钮后,您将进入第二个 activity,其中包含一个接受一些输入(tokenName、tokenID 和 averagePrice)并创建对象 'Token' 的表单。第二个 activity 也有一个按钮,用于将令牌保存到 TokenList 并再次将您带到 MainActivity。
问题是您刚刚创建的令牌没有显示,但如果您创建一个新令牌,第一个出现在 ListView
MainActivity 代码:
public class MainActivity extends AppCompatActivity {
public static ListView listView;
ArrayList<String> arrayList = new ArrayList<>();
private Button addButton;
public static ArrayAdapter<String> arrayAdapter;
private EditText name;
public static TokenList tokenList = new TokenList();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
addButton = (Button) findViewById(R.id.addbutton);
listView = (ListView)findViewById(R.id.listview);
arrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, arrayList);
listView.setAdapter(arrayAdapter);
addButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
openAddToken();
arrayList.clear();
for(Token token : tokenList.tokenList){
addToList(token.getTokenName());
}
}
});
}
//Calls addToList method in TokenList class
public void addToList(String tokenName){
arrayList.add(tokenName);
}
//Opens the second activity with the new token form
public void openAddToken(){
Intent intent = new Intent(this, AddToken.class);
startActivity(intent);
}
}
第二个activity代码:
public class AddToken extends AppCompatActivity {
private Button addButton;
EditText tokenName, tokenID, averagePrice;
TokenList tokenList = MainActivity.tokenList;
Token token = new Token();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add);
tokenName=(EditText) findViewById(R.id.tokenname2);
tokenID=(EditText) findViewById(R.id.tokenid2);
averagePrice=(EditText) findViewById(R.id.averageprice);
addButton = (Button) findViewById(R.id.add);
addButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
token.setTokenName(tokenName.getText().toString());
token.setTokenID(tokenID.getText().toString());
token.setTokenName("err2");
token.setAveragePrice(Double.parseDouble(averagePrice.getText().toString()));
tokenList.addToTokenList(token);
finish();
}
});
}
}
如何在您按下第二个 activity 中的 'accept' 按钮时更新 MainActivity 中的 ListView?
我是 java 的新手,也是 android 开发的新手,所以请随时指出任何不好的做法。
谢谢!
您将项目添加到列表中,但没有通知适配器。
适配器无法知道数据已更改,除非您通知它或重新创建它
更好的实现方式是使用本地数据库,例如 ROOM library。
一个更简单的方法来解决你的问题,更好的可维护性是在你的主文件中使用 startActivityForResult()
和 onActivityResult()
。
一个例子是,在 AddToken.class
的 .onClick()
方法中添加:
Intent resultIntent = new Intent();
resultIntent.putExtra("some_key", "String data");
setResult(Activity.RESULT_OK, resultIntent);
finish();
并在 MainActivity.class
中添加以下内容:
//Inside the onClick() method in the onCreate()
//...
Intent intent = new Intent(MainActivity.this, AddToken.class);
startActivityForResult(intent, ANY_NOT_NEGATIVE_NUMBER);
//...
//Add the following outside onCreate() as a new method
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch(requestCode) {
case (ANY_NOT_NEGATIVE_NUMBER) : {
if (resultCode == Activity.RESULT_OK) {
// TODO Extract the data returned from the child Activity.
String returnValue = data.getStringExtra("some_key");
}
break;
}
}
}
在此代码中,ANY_NOT_NEGATIVE_NUMBER
是您可以在 MainActivity.class
中定义的数字。而不是共享引用,然后使用意图的 putExtra()
方法(在您的 AddToken.class
中将数据传递回 MainActivity
并将其添加到您的列表中并通知适配器列表视图适配器上 notifyDataSetChanged()
的更改。
我建议使用 recyclerview 以获得更好的性能和功能。你可以看看HERE: Create dynamic lists with RecyclerView
我的 MainActivity 中有一个 ListView 和一个 'add' 按钮。按下按钮后,您将进入第二个 activity,其中包含一个接受一些输入(tokenName、tokenID 和 averagePrice)并创建对象 'Token' 的表单。第二个 activity 也有一个按钮,用于将令牌保存到 TokenList 并再次将您带到 MainActivity。 问题是您刚刚创建的令牌没有显示,但如果您创建一个新令牌,第一个出现在 ListView
MainActivity 代码:
public class MainActivity extends AppCompatActivity {
public static ListView listView;
ArrayList<String> arrayList = new ArrayList<>();
private Button addButton;
public static ArrayAdapter<String> arrayAdapter;
private EditText name;
public static TokenList tokenList = new TokenList();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
addButton = (Button) findViewById(R.id.addbutton);
listView = (ListView)findViewById(R.id.listview);
arrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, arrayList);
listView.setAdapter(arrayAdapter);
addButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
openAddToken();
arrayList.clear();
for(Token token : tokenList.tokenList){
addToList(token.getTokenName());
}
}
});
}
//Calls addToList method in TokenList class
public void addToList(String tokenName){
arrayList.add(tokenName);
}
//Opens the second activity with the new token form
public void openAddToken(){
Intent intent = new Intent(this, AddToken.class);
startActivity(intent);
}
}
第二个activity代码:
public class AddToken extends AppCompatActivity {
private Button addButton;
EditText tokenName, tokenID, averagePrice;
TokenList tokenList = MainActivity.tokenList;
Token token = new Token();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add);
tokenName=(EditText) findViewById(R.id.tokenname2);
tokenID=(EditText) findViewById(R.id.tokenid2);
averagePrice=(EditText) findViewById(R.id.averageprice);
addButton = (Button) findViewById(R.id.add);
addButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
token.setTokenName(tokenName.getText().toString());
token.setTokenID(tokenID.getText().toString());
token.setTokenName("err2");
token.setAveragePrice(Double.parseDouble(averagePrice.getText().toString()));
tokenList.addToTokenList(token);
finish();
}
});
}
}
如何在您按下第二个 activity 中的 'accept' 按钮时更新 MainActivity 中的 ListView? 我是 java 的新手,也是 android 开发的新手,所以请随时指出任何不好的做法。
谢谢!
您将项目添加到列表中,但没有通知适配器。 适配器无法知道数据已更改,除非您通知它或重新创建它
更好的实现方式是使用本地数据库,例如 ROOM library。
一个更简单的方法来解决你的问题,更好的可维护性是在你的主文件中使用 startActivityForResult()
和 onActivityResult()
。
一个例子是,在 AddToken.class
的 .onClick()
方法中添加:
Intent resultIntent = new Intent();
resultIntent.putExtra("some_key", "String data");
setResult(Activity.RESULT_OK, resultIntent);
finish();
并在 MainActivity.class
中添加以下内容:
//Inside the onClick() method in the onCreate()
//...
Intent intent = new Intent(MainActivity.this, AddToken.class);
startActivityForResult(intent, ANY_NOT_NEGATIVE_NUMBER);
//...
//Add the following outside onCreate() as a new method
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch(requestCode) {
case (ANY_NOT_NEGATIVE_NUMBER) : {
if (resultCode == Activity.RESULT_OK) {
// TODO Extract the data returned from the child Activity.
String returnValue = data.getStringExtra("some_key");
}
break;
}
}
}
在此代码中,ANY_NOT_NEGATIVE_NUMBER
是您可以在 MainActivity.class
中定义的数字。而不是共享引用,然后使用意图的 putExtra()
方法(在您的 AddToken.class
中将数据传递回 MainActivity
并将其添加到您的列表中并通知适配器列表视图适配器上 notifyDataSetChanged()
的更改。
我建议使用 recyclerview 以获得更好的性能和功能。你可以看看HERE: Create dynamic lists with RecyclerView