Заполнение ListView из SharedPreferences - PullRequest
0 голосов
/ 10 марта 2012

Что я хочу сделать, это заполнить ListView из записи AlertDialog. Я пытался сделать это с SharedPreferences, ранее у меня была последняя запись, просто сохраняемая в ListView (если я ввел более одной строки), поэтому, когда я покинул действие и возвратил все, что появилось в списке, было моим последним запись.

Однако я решил эту проблему и изменил процедуру сохранения, чтобы изменить поле «Ключ» сохраненного предпочтения, увеличивая присоединенную переменную Int.

Чтобы дать вам полную картину происходящего: Первый пост, так что рис здесь: http://imgur.com/yGLQx Это вывод нескольких записей в ListView.

Если вы остаетесь в Деятельности, ListView заполняется записями от пользователя, однако после выхода из операции и возврата к ней, как и записи, они были зарегистрированы, но значения String не были сохранены.

Вот мой код:

public class ManageLinguisticPhrases extends ListActivity {

private static final String PHRASE = "Phrase_";

private SharedPreferences prefs;
private String prefName = "myPhrasesStorage";

ArrayList <String> listItems = new ArrayList <String>();    
ArrayAdapter <String> adapter;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

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

    prefs = getSharedPreferences(prefName, MODE_PRIVATE);
    LinkedList<String> phrasesCollection = new LinkedList<String>();
    int phraseCount = prefs.getInt("phrase_count", 0);

    for(int i = 1; i <= phraseCount; i++) { 
        phrasesCollection.add(prefs.getString(PHRASE + i, "<< Enter a phrase >>"));
    }

    listItems.addAll(phrasesCollection);
    adapter.notifyDataSetChanged();               

}


@Override
protected Dialog onCreateDialog(int id) 
{

    final EditText input = new EditText(this);
    final String text = input.getText().toString();

    switch (id) 
    {
    case 0:
        return new AlertDialog.Builder(this)
        .setIcon(R.drawable.ic_launcher)
        .setTitle("Please enter the new data")
        .setView(input)
        .setPositiveButton("Save", new DialogInterface.OnClickListener() 
        {   
            public void onClick(DialogInterface dialog, int whichButton)
            {                                           
                listItems.add(input.getText().toString());                  
                adapter.notifyDataSetChanged();

                prefs = getSharedPreferences(prefName, MODE_PRIVATE);
                SharedPreferences.Editor editor = prefs.edit();
                    //increments index by 1
                    editor.putInt("phrase_count", prefs.getInt("phrase_count", 0) + 1);
                    //save new phrase in myPhrasesStorage with key "name[index]"                
                    editor.putString(PHRASE + (prefs.getInt("phrase_count", 0) + 1), text);

                editor.commit();

            }
        })
        .setNegativeButton("Cancel", new DialogInterface.OnClickListener() 
        {
            public void onClick(DialogInterface dialog, int whichButton)
            {


            }
    })      

            .create();
    }
    return null;
}

private void CreateMenu(Menu menu)
{
    MenuItem mnu1 = menu.add(0, 0, 0, "Add data");
    {
        mnu1.setAlphabeticShortcut('a');
        mnu1.setIcon(android.R.drawable.ic_menu_add);
    }
    MenuItem mnu2 = menu.add(0, 1, 1, "Edit data");
    {
        mnu2.setAlphabeticShortcut('b');
        mnu2.setIcon(android.R.drawable.ic_menu_edit);
    }
    MenuItem mnu3 = menu.add(0, 2, 2, "Delete data");
    {
        mnu3.setAlphabeticShortcut('c');
        mnu3.setIcon(android.R.drawable.ic_menu_delete);
    }

}

private boolean MenuChoice(MenuItem item)
{
    switch (item.getItemId()) 
    {
        case 0:

            showDialog(0);

        return true;            
    }
    return false;
}

@Override
public boolean onCreateOptionsMenu(Menu menu) 
{
    super.onCreateOptionsMenu(menu);
    CreateMenu(menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item)
{
    return MenuChoice(item);
}

Так что да, посмотрите, скажите мне, если я делаю что-то нелепое, и дайте мне знать!

Приветствия за помощь!

Ответы [ 3 ]

0 голосов
/ 10 марта 2012

Сколько фраз вы сохраняете в общие префы?Если это больше, чем несколько (скажем, 10), я бы предложил вместо этого использовать базу данных sqlite.Общие настройки не предназначены для больших списков данных.

В любом случае, я думаю, что, возможно, обнаружил вашу проблему.Когда вы нажимаете кнопку «Сохранить», запускается следующий код:

listItems.add(input.getText().toString());                  
adapter.notifyDataSetChanged();

Вы уже настроили адаптер на использование массива listItems в начале, и (я полагаю) теперь adapter имеет свой собственныйвнутренний массив, который он использует для хранения данных.Попробуйте это:

adapter.add(input.getText().toString());         
adapter.notifyDataSetChanged();

На самом деле, я не думаю, что вам действительно нужен массив listItems в качестве переменной экземпляра, и вы должны быть в состоянии полностью избавиться от phrasesCollection.Вернемся в начало вашего метода onCreate, попробуйте это:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    prefs = getSharedPreferences(prefName, MODE_PRIVATE);

    int phraseCount = prefs.getInt("phrase_count", 0);
    ArrayList <String> listItems = new ArrayList <String>();

    for(int i = 1; i <= phraseCount; i++) { 
        listItems.add(prefs.getString(PHRASE + i, "<< Enter a phrase >>"));
    }

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

}

Надеюсь, это поможет.

0 голосов
/ 11 марта 2012

Итак, я нашел решение, я сделал его слишком сложным в первый раз с помощью итератора ArrayList.

Теперь решение в основном добавляет ручные записи в ListView из AlertDialog, записи сохраняютсяв ArrayList listItems.

Обновленный исходный код:

public class ManageLinguisticPhrases extends ListActivity 
{

    private static final String PHRASE = "Phrase_";

    private String prefName = "myPhrasesStorage";
    private SharedPreferences prefs;     

    private ArrayList <String> listItems = new ArrayList <String>();         
    private  List<String> phrasesCollection = new LinkedList<String>();

    private String phraseText = "test";            
    private static int count = 0;

    private ArrayAdapter <String> adapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

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

        prefs = this.getSharedPreferences(prefName, MODE_PRIVATE);

        for(int i = 0; i <= prefs.getAll().size(); i++) {    
            phrasesCollection.add(i, prefs.getString(PHRASE + i, "Ola, Tudo bem?"));            
        }          

        listItems.addAll(phrasesCollection);
        adapter.notifyDataSetChanged();         

    }


    @Override
    protected Dialog onCreateDialog(int id) 
    {

        final EditText input = new EditText(this);

        switch (id) 
        {
        case 0:
            return new AlertDialog.Builder(this)
            .setIcon(R.drawable.ic_launcher)
            .setTitle("Please enter the new data")
            .setView(input)
            .setPositiveButton("Save", new DialogInterface.OnClickListener() 
            {    
                public void onClick(DialogInterface dialog,    int whichButton)
                {                                            
                    phraseText = input.getText().toString();
                    listItems.add(phraseText);   

                    adapter.notifyDataSetChanged();                                        

                    prefs = getSharedPreferences(prefName, MODE_PRIVATE);
                    SharedPreferences.Editor editor = prefs.edit();                    

                    //save new phrase in myPhrasesStorage with key "Phrase_[count]"                
                    editor.putString(PHRASE + count + "", phraseText);
                    count++;

                    editor.commit();

                }
            })
            .setNegativeButton("Cancel", new DialogInterface.OnClickListener() 
            {
                public void onClick(DialogInterface dialog,    int whichButton)
                {


                }
        })        

                .create();
        }
        return null;
    }

    private void CreateMenu(Menu menu)
    {
        MenuItem mnu1 = menu.add(0, 0, 0, "Add data");
        {
            mnu1.setAlphabeticShortcut('a');
            mnu1.setIcon(android.R.drawable.ic_menu_add);
        }
        MenuItem mnu2 = menu.add(0, 1, 1, "Edit data");
        {
            mnu2.setAlphabeticShortcut('b');
            mnu2.setIcon(android.R.drawable.ic_menu_edit);
        }
        MenuItem mnu3 = menu.add(0, 2, 2, "Clear ALL data");
        {
            mnu3.setAlphabeticShortcut('c');
            mnu3.setIcon(android.R.drawable.ic_menu_delete);
        }

    }

    private boolean MenuChoice(MenuItem item)
    {
        switch (item.getItemId()) 
        {
            case 0:

                showDialog(0);

            return true;

            case 2:

                prefs = getSharedPreferences(prefName, MODE_PRIVATE);
                SharedPreferences.Editor editor = prefs.edit();        

                editor.clear();
                editor.commit();

                listItems.clear();
                adapter.notifyDataSetChanged();

                Toast.makeText(this, "All phrases deleted",
                        Toast.LENGTH_LONG).show();

            return true;
        }
        return false;
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
    {
        super.onCreateOptionsMenu(menu);
        CreateMenu(menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
        return MenuChoice(item);
    }        
}

Наслаждайтесь!

0 голосов
/ 10 марта 2012

Возможно, отображается содержимое строк, но их цвет шрифта черный! Проверьте это, нажав на них или установите цвет фона для списка.

...