2013-05-10 2 views
0

Я прочитал некоторый вопрос об этой проблеме, но я не могу ее решить.Обновление ListView (в фрагменте) после отклонения Dialog

У меня было так:

public class Classwork extends FragmentActivity { 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_homework); 
    mViewPager = (ViewPager) findViewById(R.id.pager); 
    mViewPager.setAdapter(mSectionsPagerAdapter); 
} 

public class SectionsPagerAdapter extends FragmentStatePagerAdapter { 

    public SectionsPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 



    @Override 
    public Fragment getItem(int position) { 
     // getItem is called to instantiate the fragment for the given page. 
     // Return a DummySectionFragment (defined as a static inner class 
     // below) with the page number as its lone argument. 
     Fragment fragment = new DummySectionFragment(); 
     Bundle args = new Bundle(); 
     args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, position + 1); 
     args.putInt("posizione", position); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    @Override 
    public int getCount() { 
     //code for number of pages 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     //code for return the title 
    } 



} 


public class DummySectionFragment extends Fragment { 
    public static final String ARG_SECTION_NUMBER = "section_number"; 

    public DummySectionFragment() { 
    } 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     //query to populate ListView 
     //ListView with CustomAdapter 
     listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      public void onItemClick(AdapterView<?> myAdapter, View myView, int myItemInt, long mylng) { 
       //Start new activity DialogDeleteAddGradeCopy 

      } 
     }); 
     myDbHelper.close(); 
     return rootView; 
    } 
} 

}

Я создал его с помощью мастера Eclipse. DummyFragment содержит ListView, который заполняется (правильно) SQLite-запросом. С помощью щелчка на элементе ListView отображается диалоговое окно (на самом деле это действие со стилем диалога).

Диалог:

public class DialogDeleteAddGradeCopy extends Activity { 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    //retrive data form Intent for the update in the db 
    button.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 

      //update the db 
       finish(); 
      } 
     } 
    }); 

}

Этот диалог позволяет пользователю обновлять (с дб запроса) одного из значений щелкнутыми пункта. Все работает нормально, кроме обновления фрагмента. Запрос на обновление в порядке (db обновляется, когда диалог закрыт), но для обновления фрагмента мне нужно дважды или дважды прокручивать вправо или влево и поворачивать назад (таким образом, фрагмент воссоздается, поэтому все работает отлично).

Как я могу заставить обновить/воссоздать Фрагмент?

Заранее спасибо.

Извините за мой плохой английский ...

+0

Попробуйте CustomAdapter.notifyDataSetChanged() в onResume() вашего фрагмента – nicous

+0

Ничего не происходит ... onResume() вызывается, когда диалог отклоняется (finish()), но при этом не обновляется ListView. Спасибо, в любом случае. – rivamarco

ответ

0

Обычно при использовании нескольких экземпляров Fragment (которые я предполагаю, что вы основаны на взмахе левого/правый красть комментарий) вы не хотите, чтобы обновить содержимое используя Intent, как и в случае с активностью, но используя Interface.

Если данные поступают от другого Fragment, размещенного в том же действии, скажем, в настройке ViewPager или вкладке, вы должны установить интерфейс между фрагментом отправки информации и активностью хоста, а затем вызвать общедоступный метод для обновления возвращающий фрагмент изнутри хост-активности. Основы using an interface to update fragments можно найти здесь. Я не знаю специфики всего вашего проекта, но я бы посмотрел на это.

Что касается того, что писал:

Вы код не ведет себя правильно, потому что getItem не является правильным в данном контексте. При обновлении информации, передавая намерение и нужно получить новую Bundle информации, которую вы должны использовать

@Override 
protected void onNewIntent(Intent intent) { 
    // TODO Auto-generated method stub 
    super.onNewIntent(intent); 
} 

Вы, возможно, установить флаг активности, чтобы получить эту работу (например, FLAG_ACTIVITY_SINGLE_TOP), но пояснит идею onNewIntent будет обновляться, когда новое намерение будет передано вашей деятельности. Используя getItem, поскольку у вас есть это сейчас, он будет обновляться только тогда, когда изначально создан фрагмент и установлены аргументы.

Смежные вопросы