将 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<String> myList = (ArrayList<String>) getIntent().getSerializableExtra("mylist");
如果E
类型是Serializable,您可以以同样的方式传递ArrayList<E>
。
【讨论】:
【参考方案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?