putExtra 似乎根本不起作用。使用ListView获取字符串,使用listView显示字符串

Posted

技术标签:

【中文标题】putExtra 似乎根本不起作用。使用ListView获取字符串,使用listView显示字符串【英文标题】:putExtra doesn't seem to be working at all. Using ListView to get a string and using listView to display a string 【发布时间】:2015-06-05 07:05:19 【问题描述】:

我正在编写一个消息传递应用程序,我想在组中添加用户。但是,当弹出用户列表并且我从列表中选择一个时,它不会将字符串(用户名)传递给另一个活动。我得到的只是一个空列表。

这是我的代码: 第一个活动 = 通过 putExtra() 发送数据(列表中的用户名)

public class ListUsersActivity extends Activity 
private String currentUserId;
private ArrayAdapter<String> namesArrayAdapter;
private ArrayList<String> names;
private ListView usersListView;
private Button logoutButton;
private ProgressDialog progressDialog;
private BroadcastReceiver receiver = null;


@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_list_users);
    Parse.initialize(this, "embpZ0spRUv5XwDgI23innll1sgHg0KZNiKzg6kl", "LPsU4UffPeqFXkQB1GfLCIJ4kvg20llPgbOnLise");
    currentUserId = ParseUser.getCurrentUser().getObjectId();
    names = new ArrayList<>();
    ParseQuery<ParseUser> query = ParseUser.getQuery();

    query.whereNotEqualTo("objectId", currentUserId);
    query.findInBackground(new FindCallback<ParseUser>() 
        public void done(List<ParseUser> userList, com.parse.ParseException e) 
            if (e == null) 
                for (int i=0; i<userList.size(); i++) 
                    names.add(userList.get(i).getUsername().toString());
                
                usersListView = (ListView)findViewById(R.id.usersListView);
                namesArrayAdapter =
                        new ArrayAdapter<String>(getApplicationContext(),
                                R.layout.user_list_item, names);
                usersListView.setAdapter(namesArrayAdapter);
                usersListView.setOnItemClickListener(new AdapterView.OnItemClickListener() 
                    @Override
                    public void onItemClick(AdapterView<?> a, View v, int i, long l) 
                        Intent goBackToAddPoolIntent = new Intent(ListUsersActivity.this, addNewPoolActivity.class);
                        addNewPoolActivity checker = new addNewPoolActivity();
                        checker.checkIfUserIsSelected(usersListView.getItemAtPosition(i).toString());
                        goBackToAddPoolIntent.putExtra("username", usersListView.getItemAtPosition(i).toString());
                        startActivity(goBackToAddPoolIntent);

                    
                );
             else 
                Toast.makeText(getApplicationContext(),
                        "Error loading user list",
                        Toast.LENGTH_LONG).show();
            
        
    );


第二个活动 = 从 putExtra() 接收数据

public class addNewPoolActivity extends Activity 
private static ArrayList<String> addedUsers;
private ArrayAdapter <String> addedUserAdapter;
private boolean userIsSelected;

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_add_new_pool);
    Button addMembers = (Button) findViewById(R.id.bAddMembers);
    addedUsers = new ArrayList<>();
    //addedUsers.add("Group Members");
    addMembers.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            Intent showUsersToSelect = new Intent(addNewPoolActivity.this, ListUsersActivity.class);
            startActivity(showUsersToSelect);

        
    );

    ListView addedUsersList = (ListView) findViewById(R.id.addedUsersListView);

    addedUserAdapter = new ArrayAdapter<>(this, R.layout.user_list_item, addedUsers);
    addedUsersList.setAdapter(addedUserAdapter);
    if(userIsSelected)
        Bundle extras = getIntent().getExtras();
        addedUsers.add(extras.getString("username"));
    



public void checkIfUserIsSelected(String user)
    if (user!=null)
        userIsSelected = true;
    else
        userIsSelected = false;
    

【问题讨论】:

你在哪里打电话给putExtra 它在onItemClick方法@BishopBarber的第一个活动中 【参考方案1】:

因为the default value for a boolean 是false,所以代码永远不会被调用,因为

if(userIsSelected)

将始终评估为 false,因为您已将变量声明为

private boolean userIsSelected;

这里的第一个 sn-p 在 onCreate() 中,所以它只会在第一次创建 Activity 时运行。

也许您想在该代码之前调用checkIfUserIsSelected(someUser),但没有更多关于您希望完成的内容的上下文,很难说。

您可能想以某种方式使用startActivityForResult()?

【讨论】:

【参考方案2】:

除了@codeMagic 的答案(由于您的布尔值为 false,它不会调用您正在添加新数据的语句)。这也是因为您在 ListView 的 setAdapter 之后解析了数据“用户名”。所以基本上你是在设置数据,然后尝试将你解析的新数据添加到列表中。您需要在将数据集设置为适配器之前执行此操作,或者调用 addedUsersAdapter.notifyDataSetChanged() 以刷新您的 listView 的数据集。

addedUserAdapter = new ArrayAdapter<>(this, R.layout.user_list_item, addedUsers);
addedUsersList.setAdapter(addedUserAdapter);

Bundle extras = getIntent().getExtras();

// Check if the username has been sent to this Activity.
if(extras != null && extras.containsKey("username"))
   addedUsers.add(extras.getString("username"));

   // Refresh Your Data Set
   addedUserAdapter.notifyDataSetChanged();

【讨论】:

以上是关于putExtra 似乎根本不起作用。使用ListView获取字符串,使用listView显示字符串的主要内容,如果未能解决你的问题,请参考以下文章

从 Android 上的 Qt 应用程序通过(显式)意图调用外部活动 - putExtra 不起作用

Laravel 路线根本不起作用

试图向新成员发送欢迎信息,但我尝试过的大多数事情似乎根本不起作用

在 XCUITest 中使用条件似乎不起作用

快速播放声音似乎不适用于我的应用程序

视频在本机反应(android)中不起作用