3

Я создал Fragment, у которого есть ListView с несколькими пунктами. Согласно моему плану, когда я нажимаю один из элементов на ListView, я перехожу к другому Fragment, получаю данные от них, заменяю исходные данные на новый и обновляю ListView. Для этого я написал код следующим образом.Android: Как изменить значение элемента ListView во фрагменте?

  1. Код внутри onCreateView() метода

    listAdapter = new AlarmOptionItemListAdapter(); 
    lvAlarmOptionList = (ListView) view.findViewById(R.id.lvAlarmOptionList); 
    initializeListItems(); 
    lvAlarmOptionList.setAdapter(listAdapter); 
    
  2. initializeListItems() метода, который добавляет несколько элементов в lvAlarmOptionList, в ListView экземпляре.

    private void initializeListItems() { 
        itemRepeatAlarm = new TextOnlyItem(); 
        itemRepeatAlarm.setTitle(getString(R.string.repeat_weekly)); 
        itemRepeatAlarm.setSubtitle(getString(R.string.never)); 
        listAdapter.addItem(itemRepeatAlarm); 
    
        itemAlarmLock = new TextOnlyItem(); 
        itemAlarmLock.setTitle(getString(R.string.alarm_lock)); 
        itemAlarmLock.setSubtitle(getString(R.string.choose_option)); 
        listAdapter.addItem(itemAlarmLock); 
    } 
    
  3. 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); 
          } 
          break; 
    
         case CODE_PASSWORD: 
          String password = data.getStringExtra(Keys.VALUE); 
          if(password != null) { 
           Log.i(ApplicationManager.LOG, "Password set to " + password); 
          } 
          break; 
    
         case CODE_REPEAT: 
          repeatType = data.getIntExtra(Keys.REPEAT_TYPE, 0); 
          switch(repeatType) { 
           case Keys.SINGLE: 
           case Keys.PLURAL: 
            Toast.makeText(activity, data.getStringExtra(Keys.REPEAT_MESSAGE), Toast.LENGTH_SHORT).show(); 
            itemRepeatAlarm.setSubtitle(getString(R.string.on)); 
            listAdapter.notifyDataSetChanged(); 
            onResume(); 
            break; 
    
           case Keys.NO_REPEAT: 
            Toast.makeText(context, getString(R.string.alarm_will_never_repeat), Toast.LENGTH_SHORT).show(); 
            itemRepeatAlarm.setSubtitle(getString(R.string.never)); 
            listAdapter.notifyDataSetChanged(); 
            onResume(); 
            break; 
    
           case Keys.EVERY_DAY: 
            Toast.makeText(context, getString(R.string.alarm_will_repeat_every_day), Toast.LENGTH_SHORT).show(); 
            itemRepeatAlarm.setSubtitle(getString(R.string.every_day)); 
            listAdapter.notifyDataSetChanged(); 
            onResume(); 
            break; 
          } 
          break; 
    
         case CODE_PATTERN: 
          pattern = data.getStringExtra(Keys.VALUE); 
          if(pattern != null) { 
           Log.i(ApplicationManager.LOG, "Pattern set to " + pattern); 
          } 
          itemAlarmLock.setSubtitle(getString(R.string.pattern)); 
          listAdapter.notifyDataSetChanged(); 
          onResume(); 
          break; 
        } 
    } 
    } 
    
  4. И, наконец, onResume() метод

    @Override 
    public void onResume() { 
        super.onResume(); 
        if(listAdapter != null) { 
         listAdapter.notifyDataSetChanged(); 
        } 
    } 
    

I управляемый t o успешно переносить данные из другого Fragment с использованием метода onActivityResult(), но я не могу обновить данные в ListView.

+1

Вы никогда не должны вызывать обратные вызовы андроида (например, 'onResume') из вашего кода. – Divers

ответ

1

В вашей onActivityResult вы изменяете itemRepeatAlarm объект, но он не обновляется автоматически в адаптере. Вы должны получить объект из адаптера и установить его значение, как это:

((TextOnlyItem) listAdapter.getItem(0)).setSubtitle(getString(R.string.on); 
listAdapter.notifyDataSetChanged(); 

Надеется, что это работает.

0

Я думаю, ваша проблема в том, что onCreateView выполняется после onActivityResult, поэтому ваш элемент будет воссоздан со старыми значениями. Попробуйте это или что-то подобное:

private void initializeListItems() { 
    if (null == itemRepeatAlarm) { 
     itemRepeatAlarm = new TextOnlyItem(); 
     itemRepeatAlarm.setTitle(getString(R.string.repeat_weekly)); 
     itemRepeatAlarm.setSubtitle(getString(R.string.never)); 
     listAdapter.addItem(itemRepeatAlarm); 
    } 

    if (null == itemAlarmLock) { 
     itemAlarmLock = new TextOnlyItem(); 
     itemAlarmLock.setTitle(getString(R.string.alarm_lock)); 
     itemAlarmLock.setSubtitle(getString(R.string.choose_option)); 
     listAdapter.addItem(itemAlarmLock); 
    } 
}