将 listView 数据从一个活动发送到另一个活动

Posted

技术标签:

【中文标题】将 listView 数据从一个活动发送到另一个活动【英文标题】:Send listView data from one activity to another 【发布时间】:2019-07-31 01:06:08 【问题描述】:

我试图弄清楚如何从 listView 中获取数据,将其存储在一个数组中,并能够在另一个活动中访问该数据数组。我会为此做一个意图并将其作为额外的传递吗?我四处寻找,但没有得到明确的答案。我希望能够访问该数据数组,以便可以在另一个活动中随机显示它。

listView.java

    public class ListView extends AppCompatActivity 
    private static final String TAG = "ListView";

    private EditText editText;
    private android.widget.ListView listView;

    DatabaseHelper mDatabaseHelper;
    Button btnAdd;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list_view);
        mDatabaseHelper = new DatabaseHelper(this);
        btnAdd = (Button) findViewById(R.id.btnAdd);
        editText = (EditText) findViewById(R.id.editText);
        listView = (android.widget.ListView) findViewById(R.id.lv);


        ArrayList<String> list = getIntent().getStringArrayListExtra("myList");

        android.widget.ListView lv = (android.widget.ListView) findViewById(R.id.lv);

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list);

        lv.setAdapter(adapter);


        //Takes user back to the main activity after clicking on back arrow
        ImageView ivBack = (ImageView) findViewById(R.id.ivBackArrow);
        ivBack.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                Log.d(TAG, "onClick: pressed back arrow");
                Intent intent = new Intent(ListView.this, MainActivity.class);
                startActivity(intent);
            
        );

        //Adds new hashtag to list and prompts if nothing is entered
        btnAdd.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                String newEntry = editText.getText().toString();

                if (editText.length() != 0) 
                    addData(newEntry);
                    editText.setText("");
                 else 
                    toastMessage("you must put something in the text field");
                
            
        );

        populateListView();
    

    /**
     * Adds new data into the Database
     * @param newEntry
     */
    public void addData(String newEntry) 
        boolean insertData = mDatabaseHelper.addData(newEntry);

        if (insertData) 
            toastMessage("Successfully inserted");
            recreate();
         else 
            toastMessage("Whoops, something went wrong");
        
    

    /**
     * Default toastMessage
     * @param message
     */
    private void toastMessage(String message) 
        Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
    

    /**
     * Populate listView with data and create listener to navigate to editDeleteList
     */
    private void populateListView() 
        Log.d(TAG, "populateListView: displaying data in the listview");

        //get data and append to list
        Cursor data = mDatabaseHelper.getData();
        ArrayList<String> listData = new ArrayList<>();
        while(data.moveToNext()) 
            //get the value from the database in column 1
            //set it to the arraylist
            listData.add(data.getString(1));
        
        //create arraylist and set it to the adapter
        ListAdapter adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, listData);
        listView.setAdapter(adapter);

        //set onclick listen to edit activity
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() 
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) 
                String name = adapterView.getItemAtPosition(position).toString();
                Log.d(TAG, "onItemClick: you clicked on " + name);

                Cursor data = mDatabaseHelper.getItemID(name); //get the id associated with that name
                int itemID = -1;
                while (data.moveToNext()) 
                    itemID = data.getInt(0);
                
                if (itemID > -1) 
                    Log.d(TAG, "onItemID: the ID is: " + itemID);
                    Intent editScreenIntent = new Intent(ListView.this, EditDeleteList.class);
                    editScreenIntent.putExtra("id",itemID);
                    editScreenIntent.putExtra("name",name);
                    startActivity(editScreenIntent);
                 else 
                    toastMessage("No ID found");
                
            
        );
    

    /**
     * Updates the listView after navigating back from EditDeleteList activity
     */
    @Override
    protected void onResume() 
        super.onResume();
        populateListView();
    

【问题讨论】:

Sending arrays with Intent.putExtra的可能重复 【参考方案1】:

    从 listView 中获取数据:

    public static String[] getStringArray(ListAdapter adapter)
    String[] a = new String[adapter.getCount()];
    for (int i = 0; i < a.length; i++)
    a[i] = adapter.getItem(i).toString();
    return a;  
    

    String[] array = getStringArray(myListView.getAdapter());

    将数组从活动发送到另一个:

    Intent intent = new Intent(context, Class.class); intent.putExtra("mylist", array);

    在另一个活动中取回它:

    ArrayList&lt;String&gt; myList = (ArrayList&lt;String&gt;) getIntent().getSerializableExtra("mylist");

    如果E 类型是Serializable,您可以以同样的方式传递ArrayList&lt;E&gt;

【讨论】:

【参考方案2】:

我假设 1) 您正在修改 ListView,2) 在按下按钮时,您想要转到另一个活动并从 Activity2 中的列表视图更新数据。从 ListView 的适配器中,您可以创建一个接口 (UpdateListListener),它将由 Activity1 实现。每当您按下按钮(编辑后)时,您只需调用 notifyDatasetChanged() 并在实现的方法 listener(onUpdatedList()) 上,您只需将列表发送到其他有意图的活动。由于 List 是一个对象,您需要按如下方式发送意图:

Intent intent = new Intent(this,Activity2.class);
intent.putExtra("myList", ListOfItems);
startActivity(intent);

ListOfItems 实现 Parcelable 的地方。您需要研究 Parcelable 的工作原理。

【讨论】:

以上是关于将 listView 数据从一个活动发送到另一个活动的主要内容,如果未能解决你的问题,请参考以下文章

从 ListView 项目中获取数据并发送到另一个活动 (Android)

如何将数据从一个 Activity 中的 ListView 传递到另一个 Activity 上的 TextView?

将活动之间的数据从列表视图传递到另一个活动

如何从存储在数据库中的 Listview 获取值到另一个活动?使用 Android 和 Mysql

无法从一个活动获取数据到另一个活动

将一行从一个列表视图发送到另一个列表视图