0

I'm trying to figure out how to get the data from a listView, store it in an Array, and be able to access that array of data in another activity. Would I do an Intent for this and pass it as an extra? I've searched around but haven't gotten a clear answer. I want to be able to access that array of data so that I can randomly display it in another activity.

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();
    }
}
  • Possible duplicate of [Sending arrays with Intent.putExtra](https://stackoverflow.com/questions/3848148/sending-arrays-with-intent-putextra) – Tejas Pandya Mar 09 '19 at 05:03

2 Answers2

2
  1. Get data from 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());

  2. Send array from activity to another one:

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

  3. Get it back within another activity:

    ArrayList<String> myList = (ArrayList<String>) getIntent().getSerializableExtra("mylist");

  4. You can pass an ArrayList<E> the same way, if the E type is Serializable.

0

I am assuming 1) You are modifying the ListView, 2) On press of button you want to go to another activity and have the data updated from listview in Activity2. From the ListView's adapter, you can create an interface (UpdateListListener) which will be implemented by the Activity1. Whenever you press button(after editing) you just a)Call notifyDatasetChanged() and on the implemented method listener(onUpdatedList()) you just send the list to the other activity with intent. Since List is an object you need to send the intent as below:

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

Where ListOfItems implements Parcelable. You need to study how Parcelable works.

HaroldSer
  • 2,025
  • 2
  • 12
  • 23