【问题标题】:Populating a ListView from SharedPreferences从 SharedPreferences 填充 ListView
【发布时间】:2012-03-10 16:51:31
【问题描述】:

我要做的是从 AlertDialog 条目填充 ListView。我曾尝试使用 SharedPreferences 来执行此操作,之前我将最后一个条目保存到 ListView 中(如果我输入了多个字符串),所以当我离开活动并返回列表中出现的所有内容时是我的最后一个进入。

但是我发现了这个问题并修改了保存过程,通过增加附加的 Int 变量来更改存储首选项的“Key”字段。

为了让您全面了解正在发生的事情: 第一篇所以图片在这里:http://imgur.com/yGLQx 这是 ListView 的多个条目的输出。

如果您留在 Activity 中,ListView 会填充来自用户的条目,但是在离开 Activity 并返回到它之后,就像条目已注册,但字符串值尚未保存。

这是我的代码:

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

所以,看看,如果我在做一些荒谬的事情,请告诉我,让我知道!

为帮助干杯!

【问题讨论】:

  • 问题也可能与从AlertDialog手动输入ArrayList listItems有关...

标签: android listview arraylist android-alertdialog sharedpreferences


【解决方案1】:

可能正在显示行的内容,但它们的字体颜色是黑色!通过单击它们或为列表视图设置背景颜色来测试它。

【讨论】:

  • 没有人,它是白色的,我什至尝试将其更改为其他内容只是为了检查,一旦您将数据输入到 AlertDialog 并单击保存,它在 ListView 中可见,如果您添加另一个,那也是可见的!当您离开活动并返回时,一切都消失了,但行仍然存在(空白),这是一个保存问题>。
【解决方案2】:

您将多少短语保存到共享首选项中?如果不止几个(比如 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);            

}

希望这会有所帮助。

【讨论】:

  • 尝试了您的更改,仍然得到相同的输出。 :(
【解决方案3】:

所以我找到了解决方案,我第一次使用 ArrayList 迭代器使其过于复杂。

该解决方案现在基本上从AlertDialog 向ListView 添加手动条目,条目存储在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);
    }        
}

享受吧!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多