【问题标题】:My ListView updates the first change after doing a second one我的 ListView 在进行第二次更改后更新了第一次更改
【发布时间】:2021-10-22 02:12:43
【问题描述】:

我的 MainActivity 中有一个 ListView 和一个“添加”按钮。按下按钮时,您将进入第二个活动,该活动的表单接受一些输入(tokenName、tokenID 和 averagePrice)并创建一个对象 'Token' 。第二个活动还有一个按钮,可将令牌保存到 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);
    }
}

第二个活动代码:

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();

            }
        });
    }
}

如何在第二个活动中按下“接受”按钮时更新 MainActivity 中的 ListView? 我是 java 新手,甚至是 android 开发新手,所以请随时指出任何不好的做法。

谢谢!

【问题讨论】:

    标签: java android android-studio listview


    【解决方案1】:

    更好的实现方式是使用本地数据库,例如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() 通知适配器更改在您的 Listview 适配器上。


    我建议使用 recyclerview 以获得更好的性能和功能。你可以去看看HERE: Create dynamic lists with RecyclerView

    【讨论】:

    • 非常感谢!我以前尝试过,但由于我是新手,我可能有问题。
    【解决方案2】:

    您将项目添加到列表中,但没有通知适配器。 适配器无法知道数据已更改,除非您通知它或重新创建它

    【讨论】:

    • 我尝试通过带有 notifyDataSetChanged() 的适配器执行此操作,但我得到的只是第二次单击 MainActivity 中的“添加”按钮时出现了令牌,而不是现在显示在之后接受第二个令牌。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    相关资源
    最近更新 更多