【问题标题】:Add items to listview from other activity将项目从其他活动添加到列表视图
【发布时间】:2015-05-06 08:59:01
【问题描述】:

场景:

第一个 mainactivity 启动,用户从菜单选项中使用 Intent 启动第二个 Activity,然后他将一些文本添加到 edittext 并使用 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);
        }
    }

}

第二个活动:

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

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

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

谁能告诉我如何让这个工作?

【问题讨论】:

  • @downvoter-关注评论而不是投反对票
  • 使用 ArrayList modelList;作为吞噬变量
  • 数据是否应该一直保存?如果是这样,我们必须使用数据库。否则我们可以在 Intent 中使用 SharedPreferences 或 Extra
  • @Chathura Wijesinghe - 是的,它被用作全局变量

标签: android listview android-intent notifydatasetchanged


【解决方案1】:
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

【讨论】:

    【解决方案2】:

    不要使用 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);
    }
    

    希望这可行。我在之前的项目中也是这样做的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-11
      • 1970-01-01
      相关资源
      最近更新 更多