从其他活动添加项目到listview

时间:2015-05-06 08:59:01

标签: android listview android-intent notifydatasetchanged

情形:

第一个mainactivity启动并从菜单选项用户使用intent启动第二个活动,然后他在edittext中添加一些文本,并使用intent对第一个活动获取该edittext值,并将该值添加到listview。

FirstActivity:

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

}

第二项活动:

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

          } 

        }

现在我的问题是我能够将数据添加到列表视图中,但每次我回到mainactivity时,之前添加的数据都会丢失并使用我的新数据更新旧数据。

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

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

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

任何人都可以说我如何让这个工作?

2 个答案:

答案 0 :(得分:0)

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

每次要添加项目时,您都要开始新的活动 考虑使用

startActivityForResult()  

Link to Android Documentation

即使 startActivityForResult()是恕我直言,这是解决问题的最佳方法,我会给你一个提示,说明为什么它不会显示你的“旧”数据。 转到第二个时,您没有完成第一个活动。你也可以完成你的第二个活动,你的MainActivity会遇到

  

onResume()

因此检查Android lifecycle

答案 1 :(得分:0)

不要使用putextra和intent技术。遵循以下技术。

在主要活动中,按如下方式创建sharedpref:

public static final String SharedPref = "MyPreferences";

在活动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);

在主要活动中:

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

希望这有效。我在之前的项目中做了同样的事情。