3

나는 ListView과 몇 가지 항목이있는 Fragment을 만들었습니다. 내 계획에 따르면 ListView에있는 항목 중 하나를 클릭하면 다른 Fragment으로 이동하여 데이터를 가져오고 원래 데이터를 새 데이터로 바꾸고 ListView을 업데이트합니다. 이를 위해 다음과 같이 코드를 작성했습니다. onCreateView() 방법안드로이드 : 조각에서 ListView 항목의 값을 변경하는 방법?

listAdapter = new AlarmOptionItemListAdapter(); 
lvAlarmOptionList = (ListView) view.findViewById(R.id.lvAlarmOptionList); 
initializeListItems(); 
lvAlarmOptionList.setAdapter(listAdapter); 
  • lvAlarmOptionList에 여러 항목의 ListView 인스턴스를되게 된 initializeListItems() 방법 내부

    1. 코드입니다. 마지막으로 다른 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; 
          } 
      } 
      } 
      
    2. 의 항목을 수정하고

      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() 방법의 onResume() 방법

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

    I 관리 된 t o onActivityResult() 메서드를 사용하여 다른 Fragment에서 데이터를 성공적으로 가져 왔지만 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); 
        } 
    } 
    
    관련 문제