Android 将值从一个活动传递到另一个活动的ListView并保存这些值
我有一个应用程序,其中主屏幕是列表视图,然后用户可以单击添加按钮,将用户带到另一个活动,用户可以从微调器中选择值,底部有一个按钮,名为保存,单击时,会将微调器中的值保存到列表项中,并将用户带回到带有列表视图和新创建的列表项的主屏幕 这是我的代码:Android 将值从一个活动传递到另一个活动的ListView并保存这些值,android,listview,Android,Listview,我有一个应用程序,其中主屏幕是列表视图,然后用户可以单击添加按钮,将用户带到另一个活动,用户可以从微调器中选择值,底部有一个按钮,名为保存,单击时,会将微调器中的值保存到列表项中,并将用户带回到带有列表视图和新创建的列表项的主屏幕 这是我的代码: package viva.inspection.com.inspectionpicker; import android.app.Activity; import android.content.Intent; import android.cont
package viva.inspection.com.inspectionpicker;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Adapter;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.HashSet;
import viva.inspection.com.inspectionpicker.R;
public class ListActivity extends Activity {
private static ArrayList<String> inspections = new ArrayList<String>();
private static ArrayAdapter<String> inspectionAdapter;
private static final String s = "inspection list";
public static final String PREFS_NAME = "MyPrefsFile";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list);
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
ArrayList<String> temp = new ArrayList<String>(settings.getStringSet(s, new HashSet<String>(inspections)));
inspections = temp;
ListView inspectionList = (ListView) findViewById(R.id.listView);
inspectionAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, inspections);
inspectionList.setAdapter(inspectionAdapter);
if(getIntent().getStringExtra("spins") != null) {
addItems(getIntent().getStringExtra("spins"));
}
System.out.println("Created");
}
@Override
protected void onPause(){
super.onPause();
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putStringSet(s, new HashSet<String>(inspections));
System.out.println("Paused");
editor.commit();
}
@Override
protected void onDestroy() {
super.onDestroy();
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putStringSet(s, new HashSet<String>(inspections));
editor.commit();
System.out.println("Destroyed");
}
@Override
protected void onResume() {
super.onResume();
inspections = temp;
ListView inspectionList = (ListView) findViewById(R.id.listView);
inspectionAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, inspections);
inspectionList.setAdapter(inspectionAdapter);
System.out.println("Resumed");
}
public static void addItems(String s) {
inspections.add(s);
inspectionAdapter.notifyDataSetChanged();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.list, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
switch(id) {
case R.id.action_settings:
return true;
case R.id.action_new:
startActivity(new Intent(this, MyActivity.class));
return true;
}
return super.onOptionsItemSelected(item);
}
}
现在,我有保存下来,但它只保存一个值,我希望它保存多个值。另外,正如您所看到的,我已经尝试实现SharedReferences类来保存我列表的值,这样当用户从多任务中删除应用程序后返回列表时,它仍然会显示用户以前拥有的值。然而,这是行不通的。正如您在上面的代码中所看到的,我尝试过使用onPause和onResume,但没有效果。我真的很困惑为什么这不起作用,因为我已经记录了活动暂停/恢复时的值,并且可以在控制台中看到记录的值。我基本上只想在列表中保存多个值,而不仅仅是一个值,并保存这些值,以便在活动被销毁时,列表视图将显示保存的值,这样就不会丢失任何数据
非常感谢您的帮助。先谢谢你
编辑:我已经解决了保存问题,但现在我需要能够保存ListView的值,以便当用户重新打开应用程序时,这些值仍然存在,并且不会消失。尝试这种方法,希望这能帮助您解决问题
您的列表活动添加按钮
“添加项目活动”“保存”按钮
在列表活动中添加项目后获取结果
您已经开发了您的主要活动,并且有一个Listview,现在您必须开发如果您单击Listview中的一个项目会发生什么,一个起点将是,即
ListView lv = getListView();
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
int itemPosition = position;
String parameter1 = "Hello";
int parameter2 = 1;
Intent i = new Intent(Name_of_your_Calling_Activity.this,
Name_of_your_called_Activity.class);
i.putExtra("parameter_name1", parameter1);
i.putExtra("parameter_name2", parameter2);
... // So many parameters as you want
// Here you have 2 Possibilities, you can get return parameters or not
// for the 1st Case you must
startActivityForResult(i, REQUEST_CODE) // (1) Alternative *
startActivity(i); // (2)
}
});
}
在被调用的活动中,您可以使用以下代码在onCreate方法中获得这些传递的参数
Bundle b = getIntent().getExtras();
if (b!=null) { // Here we could assume i.e. we get 2 return params of typ int with this name. They were put in the called Activity like we made in above code, so, `intent.put...`
String value = b.getInt("param1");
int value2 = b.getInt("param2");
}
我发现这是一个很好的起点,如果你想拥有一些东西,你可以看到
看看Android开发者参考资料,你可以看到详细的例子,我已经解释了grosso modo
我希望,这将引导您找到一个解决方案StartActivityForResult,并从结果中获得新的附加值,然后尝试将此值添加到您的列表中并通知。@Haresh我为什么要使用StartActivityForResult?当您单击“保存”按钮保存微调器值时,它会将您带回ListView活动。现在,我如何准确地保存这些值,以便在您将应用程序从多任务中删除并重新打开时,它仍然会在listview中显示保存的值?然后您必须将列表数据存储在数据库中。此外,添加按钮位于操作栏中,并且它位于带有listview的Main活动中,因此我应该将onActivityResult my Main Activity与列表视图放在哪里,或者将活动与微调器和保存按钮放在哪里?没关系,我已经找到了答案。你能解释一下为什么我的listview没有保存值,即使我重写了onpause和onresume方法并试图在那里保存数据?Vishwa,看看haresh是怎么做的,他只需要在addItems下面添加一个“adapter.notifyDataSetChanged”。。。为了使用此保存按钮的ListView get updatedIn onClick方法,您可以使用获得的正确值返回到第一个活动,在本例中为微调器的值,只需编写一个intent.putExtraexample,strName;当然,假设spinner的选定值是一个字符串。上面我的意思是只写…,当然,当您传递返回参数时,您需要正确调用activity。这里有一个例子,比如你想要一个ArrayList,不是吗?在这里,您必须使用正确的位置和正确的返回值进行更新/添加,您可以使用a进行更新,然后如果您更新现有位置,您可以使用set方法编写检查,如果您添加新项目,您可以添加,然后添加您的_adapter_变量。NotifyDataSetChanged查看此处和此处。你不必在onDestroy或其他方法中做任何额外的事情,你在onCreate中所做的一切都将保留,直到你卸载该应用程序,你在那里打开了你的SharedReference,你应该在OnActivity中设置/添加你的OnActivity。结果在SharedReferences中更新了ArrayListinspection,或者更好地说,就是新项目。Vishwa我必须去,但我推荐你,您考虑使用内容提供者/db来做它。这里非常清楚您可以如何使用或保留S的首选项,但在onResume、onDestroy等中不做任何操作,只需在onCreate中创建首选项,并在onActivityResult中更新。因此,您必须在S的首选项中进行提交,在ListView中进行适当的设置适配器和通知。
Intent intent = new Intent();
intent.putExtra("NEW_VALUE","new list item");
setResult(RESULT_OK,intent);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode==RESULT_OK){
if(requestCode == GET_VALUE){
if(data.getStringExtra("NEW_VALUE")!=null && data.getStringExtra("NEW_VALUE").length()>0){
addItems(data.getStringExtra("NEW_VALUE"))
}
}
}
}
ListView lv = getListView();
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
int itemPosition = position;
String parameter1 = "Hello";
int parameter2 = 1;
Intent i = new Intent(Name_of_your_Calling_Activity.this,
Name_of_your_called_Activity.class);
i.putExtra("parameter_name1", parameter1);
i.putExtra("parameter_name2", parameter2);
... // So many parameters as you want
// Here you have 2 Possibilities, you can get return parameters or not
// for the 1st Case you must
startActivityForResult(i, REQUEST_CODE) // (1) Alternative *
startActivity(i); // (2)
}
});
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// Check which request we're responding to
if (requestCode == REQUEST_CODE) {
// Make sure the request was successful
if (resultCode == RESULT_OK) {
Bundle b = data.getExtras();
if ( b!= null ) { // Assuming you put a returnBack Param with the name "returnBack1"
String retBack1 = b.getString("returnBack1");
}
// Do something with the contact here (bigger example below)
}
}
Bundle b = getIntent().getExtras();
if (b!=null) { // Here we could assume i.e. we get 2 return params of typ int with this name. They were put in the called Activity like we made in above code, so, `intent.put...`
String value = b.getInt("param1");
int value2 = b.getInt("param2");
}