2012-04-03 63 views
0

我有一个活动,可以让用户在按下按钮时加载一些数据。该数据被传递给一个列表,并且每个列表项都有不同的数据存储在其中。当他们点击列表项目时,它会启动一个将它们传递给新类别的意图。将意图附加到从SharedPreferences恢复的列表项目

但是,当我存储从按下这个按钮返回的第一个值,即使用onStop()和使用SharedPreferences,并点击它,我得到一个错误。我认为这可能与意图有关 - 列表项不附加到它。下面是部分代码:

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

    list = getListView(); 
    list.setOnItemClickListener(this); 

    if(settings.contains("ARRAY_LIST_VALUE_0")) 
    { 
     listItems.add(0, settings.getString("ARRAY_LIST_VALUE_0",tempStore)); 
     adapter.notifyDataSetChanged(); 
    } 
    reload = (Button)findViewById(R.id.reloadTen); 
    reload.setOnClickListener(this); 

    // Original onItemClicked was in here 
    list.setTextFilterEnabled(true); 
} 


@Override 
public void onItemClick(AdapterView<?> arg0, View listItem, int position, long arg3) 
{ 
    // Start an activity based on what list view item is pressed 
    Intent intent = new Intent(newSightings.this, newCompass.class); 

    // Pass the data we retrieved to the next activity 
    intent.putExtra("info",data[position] ); 
    startActivity(intent); 
} 

@Override 
protected void onStop() 
{ 
    super.onStop(); 

    SharedPreferences settings = getSharedPreferences(PREFS_NAME,0); 
    SharedPreferences.Editor editor = settings.edit(); 

    if(usrPrssdBtn) 
    { 
      // Store the latitude and longitude values and then reload them if known 
      editor.putString("LAT",myNewLat); 
      editor.putString("LONG",myNewLon); 

      // Place first element of array list in storage 
      if(adapter.getCount() > 0) 
      { 
       Toast.makeText(getApplicationContext(), "Leaving Activity, Adapter Size: "+ adapter.getCount()+"\nStoring: "+listItems.get(0).toString(), Toast.LENGTH_SHORT).show(); 
       tempStore = listItems.get(0).toString(); 

       editor.putString("ARRAY_LIST_VALUE_0",tempStore); 
       editor.putString("DATA",data[arryTrckr]); 
      } 
    } 
    editor.commit(); 

} 

所以 - 当我运行的活动,然后压回,然后再返回到该活动的存储列表项是存在的。问题是当我点击它崩溃的应用程序。有什么问题?我在这行得到一个NullPointerException:

intent.putExtra("info",data[position]); 
+0

什么是取数据“数据“在你的代码 – 2012-04-03 03:21:25

+0

数据是一个数组,它保存来自web解析的结果的值并将它们存储以传递到下一个活动 – Katana24 2012-04-03 10:37:26

+0

用onStop() – 2012-04-03 11:06:48

回答

1

adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1,listItems);

在上面的行中,您正在使用listitems数组来播放数据。 其中作为onItemclick事件使用的是

数据[位置]根据我,当你从listItems数组的必须使用listItems中[位置]显示数据来获取数据

+0

你能否详细说明你有点难以理解 – Katana24 2012-04-03 10:49:23

+1

用listitems [位置]替换数据[位置]并尝试 – 2012-04-03 10:50:53

+0

你好 - 运行良好。感谢队友:D告诉我,如果我在这里是正确的 - 最初是当试图从活动回来B - >活动A我试图引用不存在的东西 - 即空指针异常。但是,当将数据更改为listItems时,listItems.get(position)会引用保存的东西,因此它可以工作吗? – Katana24 2012-04-03 11:00:22

1

什么你的意思是,你的意图是空当你从活动一展身手 - >活动B - >返回到活动A - >活动B一遍吗?

我认为你第一次从A - > B启动了你的意图,意图被传递了,然后你在从B返回时onResume活动A.如果你的意图没有被重新初始化(new Intent(...)),那么您在活动A中持有的参考将是无效的。

至少,这是我能做的最好的,没有更多的上下文。 :)

我必须问一个更广泛的问题:如果您有一个活动,其目的是修改您的设置,为什么不使用PreferenceActivity?

+0

中的listitems [arryTrckr]替换数据[arryTrckr]我查看了PreferenceActivity并且使用它不太合适,因为它不是用户设置的偏好。它实际上只是保留结果,基本上是一个查询 - 所以PreferenceActivity不会在该部分不正确? – Katana24 2012-04-03 10:57:22

+1

将查询结果存储在SharedPreferences中似乎很好奇。这是永久数据还是瞬态数据?如果它更暂时(不需要在应用程序会话中持久化),您可以考虑在活动A中使用startActivityForResult并从活动B返回结果意图中的信息。 – 2012-04-03 13:15:03

+0

我想这应该是更永久的数据,您知道何时应用程序已关闭它重新显示此数据...旧的栗子:P – Katana24 2012-04-03 13:18:43