Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 将值从一个活动传递到另一个活动的ListView并保存这些值_Android_Listview - Fatal编程技术网

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");
}