将来自其他 activity 的项目添加到列表视图

Add items to listview from other activity

场景:

第一个 mainactivity 启动,用户从菜单选项启动第二个 activity 使用 intent,然后他将一些文本添加到 edittext 并使用第一个 [=31= 的 intent 获取该 edittext 值] 并将该值添加到列表视图。

第一个Activity:

public class MainActivity extends Activity {

    ListView lv;
    EditText et;
    String AddedTask ;
    ArrayList<Model> modelList;
    CustomAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

              Intent intent = getIntent();
                if (intent.hasExtra("NewTask")) {
                AddedTask = this.getIntent().getExtras().getString("NewTask");
                lv = (ListView) findViewById(R.id.listViewData);
                String name = AddedTask;
                Model md = new Model(name);
                modelList.add(md);
                adapter = new CustomAdapter(getApplicationContext(), modelList);
                lv.setAdapter(adapter);
                adapter.notifyDataSetChanged();
          }



    }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar actions click
        switch (item.getItemId()) {
        case R.id.action_settings:
            return true;
        case R.id.action_add_task:
            Intent i = new Intent(MainActivity.this, AddTask.class);
            startActivity(i);
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }

}

第二个Activity:

public class AddTask extends Activity {
Button addtask;
      @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.add_task);

            // get action bar   
            ActionBar actionBar = getActionBar();

            // Enabling Up / Back navigation
            actionBar.setDisplayHomeAsUpEnabled(true);

            addtask = (Button) findViewById(R.id.btnaddlist);
            findViewById(R.id.btnaddlist).setOnClickListener(
                      new View.OnClickListener() {
                          public void onClick(View arg0) {
                              EditText edit = (EditText) findViewById(R.id.tskname);
                              Intent i = new Intent(AddTask.this,
                                      MainActivity.class);
                              //Bundle bundle = new Bundle();
                              String TaskName = edit.getText().toString();
                              //bundle.putString("NewTask", TaskName);
                              i.putExtra("NewTask", TaskName);
                              i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                              //i.putExtras(bundle);
                              startActivity(i);
                          }
                      });

          } 

        }

现在我的问题是我可以将数据添加到列表视图,但每次我返回主视图时activity,之前添加的数据都丢失了,并用我的新数据更新了旧数据.

我搜索了很多 SO 答案,其中大多数建议添加 adapter.notifyDataSetChanged();,我已经尝试过但没有任何效果。

我已经通过检查适配器是否为空或以这种方式更新数据并获得空指针异常来完成:

if ( adapter== null )
{
   adapter = new CustomAdapter(getApplicationContext(), modelList);
  lv.setAdapter(adapter);
}

任何人都可以告诉我如何让它工作吗?

new View.OnClickListener() {
                      public void onClick(View arg0) {
                          EditText edit = (EditText) findViewById(R.id.tskname);
                          Intent i = new Intent(AddTask.this,
                                  MainActivity.class);
                          //Bundle bundle = new Bundle();
                          String TaskName = edit.getText().toString();
                          //bundle.putString("NewTask", TaskName);
                          i.putExtra("NewTask", TaskName);
                          i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                          //i.putExtras(bundle);
                          startActivity(i);
                      }
                  });

每次要添加项目时,您都会开始一个新的 Activity。
考虑使用

startActivityForResult()  

Link to Android Documentation

即使 startActivityForResult() 恕我直言是解决您问题的最佳方法,我也会提示您为什么它不显示您的问题"old" 数据。 进入第二个时,您没有完成第一个 Activity。你也可以完成你的第二个 activity 并且你的 MainActivity 将 运行 变成

onResume()

因此检查 Android lifecycle

不要使用 putextra 和 intent 技术。按照下面的技巧。

在 main activity 中创建 sharedpref 如下:

public static final String SharedPref = "MyPreferences";

在 activity 2 中插入此代码。

SharedPreferences settings=null;//declaration

settings=getSharedPreferences(SharedPref,0);//initialization

String TaskName= edit.getText().toString();
SharedPreferences.Editor editor = settings.edit();
editor.putString("NewTask", TaskName);
editor.commit();
finishfromchild(AddTask.this);

主要activity:

SharedPreferences settings=null;//declaration

在onCreate

//now initialise settings
settings=getSharedPreferences(SharedPref,0);//SharedPref is the foldername      
//of your sharedpreferences(you create it first)

//Now create onResume method
public void onResume()
{
 super.onResume();
            AddedTask=settings.getString("NewTask", "");
            lv = (ListView) findViewById(R.id.listViewData);
            String name = AddedTask;
            Model md = new Model(name);
            modelList.add(md);
            adapter = new CustomAdapter(getApplicationContext(), modelList);
            lv.setAdapter(adapter);
}

希望这能奏效。我在之前的项目中也是这样做的。