2012-03-10 149 views
0

我正在做的是从AlertDialog条目填充一个ListView。我试着用SharedPreferences来做到这一点,以前我已经把最后一个条目保存到ListView中(如果我输入了多个String),所以当我离开活动并返回列表中出现的所有内容时,我最后一次条目。从SharedPreferences填充ListView

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

为了让你发生了什么事的全貌: 第一篇文章这么PIC是在这里: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); 
} 

所以呀看看,告诉我,如果我做的事情很可笑,让我知道!

欢呼声!

+0

问题也可能与AlertDialog中'ArrayList listItems'的手动输入有关... – 2012-03-11 12:59:38

回答

0

行内容可能正在显示,但它们的字体颜色是黑色!点击它们来测试它,或为listview设置背景颜色。

+0

没有人,它是白色的,我甚至尝试将它改为别的东西来检查,一旦你输入数据到AlertDialog并单击保存,它在ListView中可见,如果添加另一个,那也是可见的!当你离开活动并返回时,一切都消失了,但行仍然存在(空白),它的保存问题>。< – 2012-03-10 17:13:24

0

您将多少个词组保存到共享首选项中?如果它不仅仅是几个(比如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

尝试更改,仍然获得相同的输出。 :( – 2012-03-10 18:25:29

0

所以我找到了解决方案,我把它与ArrayList Iterator第一次过于复杂。

该解决方案现在基本上从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); 
    }   
} 

享受!