【问题标题】:How to update ListView after onResume from other activity?如何在其他活动的 onResume 之后更新 ListView?
【发布时间】:2013-10-31 14:14:29
【问题描述】:

我正在尝试创建一个应用程序,使用户能够创建活动,然后邀请参与者。因此,当用户进入“添加参与者”页面时,在输入所有信息后,我试图通过使用 onResume() 直接返回“参与者列表”页面,但是如何更新列表视图?我尝试使用 notifyDataSetChanged() 但不工作。

这是参与者列表的代码:

public class EventPage extends ListActivity implements OnClickListener {
Intent intent;
TextView friendId;
EventController controller = new EventController(this);
TabHost th;
Button addparticipant;
String eventId;
ListView lv;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.eventpage);
    addparticipant = (Button) findViewById(R.id.addpart);
    addparticipant.setOnClickListener(this);
    // create tabs
    th = (TabHost) findViewById(R.id.tabhost);

    th.setup();
    TabSpec specs = th.newTabSpec("tag1"); // setting up a tabspec in
                                            // tabhost(th) call it tag1
    specs.setContent(R.id.tab1);// set content of "tab1" xml
    specs.setIndicator("Participants");
    th.addTab(specs);
    specs = th.newTabSpec("tag2"); // setting up a tabspec in tabhost(th)
                                    // call it tag1
    specs.setContent(R.id.tab2);// set content of "tab1" xml
    specs.setIndicator("Total Expenses");
    th.addTab(specs);
    specs = th.newTabSpec("tag3"); // setting up a tabspec in tabhost(th)
    HashMap<String, String> queryValues = new HashMap<String, String>();
    Intent objIntent = getIntent();
    eventId = objIntent.getStringExtra("eventId");
    queryValues.put("eventId", eventId);
    ArrayList<HashMap<String, String>> friendList = controller
            .getAllFriends(queryValues);
    if (friendList.size() != 0) {
        lv = getListView();
        lv.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                friendId = (TextView) view.findViewById(R.id.friendId);
                String valFriendId = friendId.getText().toString();
                Intent objIndent = new Intent(getApplicationContext(),
                        EventPage.class);
                objIndent.putExtra("friendId", valFriendId);
                startActivity(objIndent);
            }
        });
        SimpleAdapter adapter = new SimpleAdapter(EventPage.this,
                friendList, R.layout.view_friend_entry, new String[] {
                        "friendId", "friendName" }, new int[] {
                        R.id.friendId, R.id.friendName });
        adapter.notifyDataSetChanged();
        setListAdapter(adapter);
        registerForContextMenu(lv);
    }
}

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    Intent objIntent = new Intent(getApplicationContext(),
            AddParticipant.class);
    objIntent.putExtra("eventId", eventId);
    startActivity(objIntent);
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v,
        ContextMenuInfo menuInfo) {
    String[] menuItems = getResources().getStringArray(R.array.menu);
    for (int i = 0; i < menuItems.length; i++) {
        menu.add(Menu.NONE, i, i, menuItems[i]);
    }
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    int menuItemIndex = item.getItemId();
    switch (menuItemIndex) {
    case 0:
        friendId = (TextView) findViewById(R.id.friendId);
        String valFriendId = friendId.getText().toString();
        Intent objIndent = new Intent(getApplicationContext(),
                EditParticipant.class);
        objIndent.putExtra("friendId", valFriendId);
        startActivity(objIndent);
        break;
    case 1:
        friendId = (TextView) findViewById(R.id.friendId);
        String valFriendId2 = friendId.getText().toString();
        controller.deleteFriend(valFriendId2);
        onResume();
    }

    return true;
}

这是添加参与者的代码,涉及 onResume() :

public class AddParticipant extends Activity implements OnClickListener{

EditText friendName;
EditText friendNumber;
EditText friendEmail;
EventController controller = new EventController(this);
Button btnadd;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.addparticipant);
    friendName = (EditText) findViewById(R.id.friendName);
    friendNumber = (EditText) findViewById(R.id.friendNumber);
    friendEmail = (EditText) findViewById(R.id.friendEmail);
    btnadd = (Button)findViewById(R.id.saveButton);
    btnadd.setOnClickListener(this);
}

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    HashMap<String, String> queryValues = new HashMap<String, String>();
    Intent objIntent = getIntent();
    String eventId = objIntent.getStringExtra("eventId");
    queryValues.put("eventId", eventId);
    queryValues.put("friendName", friendName.getText().toString());
    queryValues.put("friendNumber", friendNumber.getText().toString());
    queryValues.put("friendEmail", friendEmail.getText().toString());
    controller.insertFriend(queryValues);
    this.callHomeActivity(v);
    finish();
}

public void callHomeActivity(View view) {
    super.onResume();
}

【问题讨论】:

  • 您可以使用 onResume() 中的新项目设置适配器
  • 正确的做法是使用startActivityForResult。您的EventPage 应该启动AddParticipant 活动以获得结果,然后处理结果onActivityResult 并更新其列表..
  • notifyDataSetChanged() 是正确的方法,但您必须更改数据才能接收此事件...developer.android.com/reference/android/widget/…

标签: android listview onresume simpleadapter


【解决方案1】:

首先,onCreate() 方法中 setListAdapter(adapter); 之前的 adapter.notifyDataSetChanged() 是无用的,因为除非您调用 setListAdapter(),否则列表不知道数据。

所以这是在 EventPage 类中的简单方法:

@Override
protected void onResume()
{
    super.onResume();

    if (getListView() != null)
    {
        updateData();
    }
}

private void updateData()
{
    SimpleAdapter adapter = new SimpleAdapter(EventPage.this, 
                                              controller.getAllFriends(queryValues), 
                                              R.layout.view_friend_entry, 
                                              new String[] {"friendId", "friendName" },
                                              new int[] { R.id.friendId, R.id.friendName });
    setListAdapter(adapter);
}

所以这里,我们基本上每次调用onResume()都会刷新数据。

如果您只想在添加新项目后执行此操作,则必须在 onResume() 上使用 onActivityResult()

private static final int ADD_PARTICIPANT = 123;// the unique code to start the add participant activity 

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == ADD_PARTICIPANT && resultCode == Activity.RESULT_OK)
    {
        updateData();
    }
}

private void updateData()
{
    SimpleAdapter adapter = new SimpleAdapter(EventPage.this, 
                                              controller.getAllFriends(queryValues), 
                                              R.layout.view_friend_entry, 
                                              new String[] {"friendId", "friendName" },
                                              new int[] { R.id.friendId, R.id.friendName });
    setListAdapter(adapter);
}

现在,只需将您的 onCreate() 方法中的 startActivity 替换为 startActivityForResult(objIndent, ADD_PARTICIPANT);

最后,在您的 AddParticipant 活动中,在 onFinish(); 之前添加 setResult(Activity.RESULT_OK);

【讨论】:

    猜你喜欢
    • 2019-11-19
    • 2020-11-21
    • 1970-01-01
    • 2023-04-11
    • 2018-04-05
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多