2017-01-04 3 views
0

これはFragmentのコードの一部です。Android:notifyDataSetChanged()がフラグメント内で機能していません

private AlarmOptionItemListAdapter listAdapter; 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_create_new_alarm, null); 

    listAdapter = new AlarmOptionItemListAdapter(); 
    ListView lvAlarmOptionList = (ListView) view.findViewById(R.id.lvAlarmOptionList); 
    lvAlarmOptionList.setAdapter(listAdapter); 
    initializeListItems(); 

    ... 

    return view; 
} 

private void initializeListItems() { 
    itemAlarmLock = new TextOnlyItem(); 
    itemAlarmLock.setTitle(getString(R.string.alarm_lock)); 
    itemAlarmLock.setSubtitle(getString(R.string.choose_option)); 
    listAdapter.addItem(itemAlarmLock); 
    listAdapter.notifyDataSetChanged(); 
} 

今、私はこのFragmentonActivityResult()メソッドをオーバーライド。このコードから、私はListViewの項目のテキストを変更する予定です。

このonActivityResult()は、Fragmentからデータを取得します。持って来たデータで、私はListViewのアイテムのテキストを新しいものに置き換えようとします。私はこのコードを実行すると

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if(resultCode == RESULT_OK && data != null) { 
     switch(requestCode) { 
      case CODE_PIN: 
       String value = data.getStringExtra(Keys.VALUE); 
       if(value != null) { 
        Log.i(ApplicationManager.LOG, "PIN set to " + value); 
        itemAlarmLock.setSubtitle(getString(R.string.pin)); 
        listAdapter.notifyDataSetChanged(); 
       } 
       break; 

      case CODE_PASSWORD: 
       String password = data.getStringExtra(Keys.VALUE); 
       if(password != null) { 
        Log.i(ApplicationManager.LOG, "Password set to " + password); 
        itemAlarmLock.setSubtitle(getString(R.string.password)); 
        listAdapter.notifyDataSetChanged(); 
       } 
       break; 

      case CODE_PATTERN: 
       String pattern = data.getStringExtra(Keys.VALUE); 
       if(pattern != null) { 
        Log.i(ApplicationManager.LOG, "Pattern set to " + pattern); 
        itemAlarmLock.setSubtitle(getString(R.string.pattern)); 
        listAdapter.notifyDataSetChanged(); 
       } 
       break; 
     } 
    } 
} 

、私はLogが適切に見せていたことが判明、何とかリストビューには、値を変更しません。

動作させるにはどうすればよいですか?

+0

を助けるだろうが、私はあなたがそれにアイテムを追加したり、製作中されている場所を確認することはできませんonActivityResult。 – adalPaRi

答えて

0

私はあなたの問題を解決するコードの下に思う:

あなたがstartActivityForResultを呼び出しているFragmentB、(で)は、以下のように記述します。

 getActivity().startActivityForResult(intent,MainActivity.CODE_PIN); 

、活動のstartActivityForResult(中)

 @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
if(resultCode == RESULT_OK && data != null) { 
    switch(requestCode) { 
     case CODE_PIN: 
      String value = data.getStringExtra(Keys.VALUE); 
      if(value != null) { 
      Fragment reference = null; 
      List<Fragment> fragmentList =  getSupportFragmentManager().getFragments(); 
      for (int i = 0; i < fragmentList.size(); i++) { 
       reference = fragmentList.get(i); 
       if (reference != null && reference instanceof FragmentA) { 
        ((FragmentA) reference).refresh(); 
       } 
      } 
      } 
      break; 
      // Same for others REQUEST_CODE's 
       } 
} 
} 

フラグメントAでは、次のようにリストをリフレッシュします。

public void refresh() 
{ 
     itemAlarmLock.setSubtitle(getString(R.string.pin)); 
       listAdapter.notifyDataSetChanged(); 
    } 
0

"pin"、 "password"、 "pattern"という文字列リソースをstrings.xmlに宣言しましたか?これは動作しません

R.string.<value of variable>(「ピン」、「パスワード」、「パターン」、あなたのケースで):

たぶん私はあなたのコードが間違って理解し、それはあなたがこれをしようとしているようです。 は、代わりにあなただけのこれを実行する必要があります。私は私が正しくあなたのコードを理解してほしい

String variable = // your value 
... 
itemAlarmLock.setSubtitle(variable); 

を、これはあなたがアダプターに通知され

+0

もちろん、私はすでに 'strings.xml'ファイルにこれらの文字列リソースを持っています。 –

+0

よろしいですか?それはちょうどウェブサイトによって悪い方法で表示されます:) – beal

関連する問題