2012-03-10 27 views
0

私が探しているのは、AlertDialogエントリからListViewを取り込むことです。私はSharedPreferencesでこれをやろうとしていましたが、以前はListViewに保存していました(複数の文字列を入力した場合)ので、アクティビティを終了してリストに表示されたものをすべて返しました。エントリ。SharedPreferencesからListViewを取り込む

しかし、私はその問題を認識し、保存された設定の "キー"フィールドを変更するために、保存されたInt変数をインクリメントして保存プロシージャを変更しました。

はあなたに何が起こっているかの全体像を与えるには: 最初の投稿をPICはここにあるので: http://imgur.com/yGLQx これは、リストビューに複数のエントリの出力です。

アクティビティ内に残っている場合は、ユーザーからのエントリが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'の手動入力に関連しているかもしれません... –

答えて

0

多分行の内容が表示されていますが、フォントの色は黒です。それらをクリックするか、リストビューの背景色を設定してテストします。

+0

いいえ、それは白です。私は一度あなたがデータを入力するとAlertDialogをクリックして保存をクリックすると、リストビューに表示されます。そのアクティビティを終了して戻ると、すべてが消えますが、行はまだ残っています(保存されていません)。< –

0

共有プリファレンスにいくつのフレーズを保存していますか?それがほんの数(例えば10)以上の場合は、代わりにsqliteデータベースを使用することをお勧めします。共有プリファレンスは、大きなデータリスト用に設計されたものではありません。

とにかく、私はあなたの問題を見つけたかもしれないと思います。あなたは、「保存」ボタンをクリックすると、このコードが実行されます。

listItems.add(input.getText().toString());     
adapter.notifyDataSetChanged(); 
adapterが、それはそれが使っていることを自身の内部配列がありますしているあなたは、すでに冒頭で listItems配列を使用するようにアダプタを設定し、(私は信じている)

データを保持する。

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

変更を試しても、同じ出力が得られます。 :( –

0

解決策が見つかりましたので、最初に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); 
    }   
} 

お楽しみください!

関連する問題