Прикрепление намерения к элементу списка, восстановленному из SharedPreferences - PullRequest
0 голосов
/ 03 апреля 2012

У меня есть действие, которое позволяет пользователю загружать некоторые данные, когда они нажимают кнопку.Эти данные передаются в список, и в каждом элементе списка хранятся разные данные.Когда они щелкают по элементу списка, он запускает намерение, которое передает их новому классу.

Но когда я сохраняю первое значение, возвращенное после нажатия этой кнопки, то есть с помощью 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] ); 

Ответы [ 2 ]

1 голос
/ 03 апреля 2012

адаптер = новый ArrayAdapter (это, android.R.layout.simple_list_item_1, listItems);

в приведенной выше строке вы используете массив listitems для sidplay данных. где в качестве события onItemclick вы используете

data [position] для извлечения данных по мне при отображении данных из массива listitems вы должны использовать listitems [position] для извлечения данных

1 голос
/ 03 апреля 2012

То, что вы говорите, это то, что ваше Намерение является нулевым, когда вы переходите от Занятия A -> Занятие B -> обратно в Занятие A -> Занятие B снова?

Я думаю, что в первый раз, когда вы запустили Intent из A -> B, Intent был передан, а затем вы возобновили действие A, когда вернетесь из B. Если ваше Intent не было повторно инициализировано (new Intent(...)) , тогда ссылка, которую вы держите на нее в действии А, будет недействительной.

По крайней мере, это лучшее, что я могу сделать без дополнительного контекста. :)

Мне нужно задать более широкий вопрос: если у вас есть Деятельность, целью которой является изменение ваших настроек, почему бы не использовать PreferenceActivity?

...