0

У меня есть два фрагмента FragmentA и FragmentB. Когда я нажимаю на элемент в FragmentB, он инициирует фрагментацию транзакций, несущую некоторые данные.Как обновить адаптер listview после изменения фрагмента

У FragmentA есть пользовательский адаптер списка, который необходимо изменить, когда есть некоторые данные из FragmentB.

Проблема в том, что это не изменилось.

здесь код в фрагменте А

public class CardsFragment extends ListFragment { 
 

 
    
 
    protected List<CardModel> list = new ArrayList<CardModel>(); 
 
    protected ArrayAdapter<CardModel> adapter; 
 

 

 
    @Override 
 
    public void onCreate(Bundle icicle) { 
 
     super.onCreate(icicle); 
 
    } 
 

 
    @Override 
 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
 
          Bundle savedInstanceState) { 
 
     View rootView = inflater.inflate(R.layout.fragment_cards, container, 
 
       false); 
 
     return rootView; 
 
    } 
 

 

 

 
    @Override 
 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
 
     super.onViewCreated(view, savedInstanceState); 
 

 
     
 
     adapter = new CardAdapter(getListView().getContext(), 
 
       list); 
 

 

 
     
 

 
     Bundle args = getArguments(); 
 
     if (args != null) { 
 
      
 
      LoadCards(args.getString("key"), args.getString("keyId")); 
 

 
     } 
 
     else{ 
 

 
      LoadAllCards(); 
 
     } 
 

 
    } 
 

 
    private void LoadAllCards() { 
 
     
 
         /** 
 
         
 
         query the database code 
 
         
 
         **/ 
 

 
        list.add(...); 
 

 
        if (getListView().getAdapter() == null) { 
 

 
         setListAdapter(adapter); 
 

 
        } else { 
 
         adapter.refill(list); 
 

 
        } 
 
    } 
 

 

 
    private void LoadCards(String key, String keyId) { 
 
     
 
         /** 
 
         
 
         query the database code 
 
         
 
         **/ 
 

 
        list.add(...); 
 

 
        if (getListView().getAdapter() != null) { 
 

 
         
 
         adapter.refill(list); 
 

 
        } 
 
    } 
 

 

 
/** 
 

 
Refill function from adapter class 
 

 
public void refill(List<CardModel> cards){ 
 

 
     list.clear(); 
 
     list.addAll(cards); 
 
     notifyDataSetChanged(); 
 

 
    } 
 

 

 

 
**/ 
 

 

 
}

+0

Вы прокомментировали refill(), но это тот код, который я бы рекомендовал. – wwfloyd

+0

Код Refill существует в другом классе CardAdapter.java! Я прокомментировал это с целью демонстрации! –

ответ

0

Ну, это очень сложная проблема, с которой я столкнулся. В той же проблеме есть несколько сообщений о stackoverflow. Я нашел рабочий пример этой проблемы here.

Добавить хэш-карту, чтобы сохранить метки всех фрагментов, которые были созданы. Таким образом, из моего FragmentActivity, я могу проверить, когда фрагмент является текущим фрагментом, и в этом случае я вызываю метод onResume() внутри Фрагмента, чтобы обновить содержимое, которое я хочу обновить.

Внутри FragmentPagerAdapter

Я определяю хэш-карту, чтобы сохранить метки фрагментов

mFragmentTags = new HashMap<Integer,String>(); 

Тогда я перегрузил метод instantiateItem, чтобы сохранить метку фрагмента в HashMap вместе с позицией.

@Override 
public Object instantiateItem(ViewGroup container, int position) { 
Object obj = super.instantiateItem(container, position); 
if (obj instanceof Fragment) { 
    // record the fragment tag here. 
    Fragment f = (Fragment) obj; 
    String tag = f.getTag(); 
    mFragmentTags.put(position, tag); 
} 
return obj; 
} 

Кроме того, я создал метод, который будет возвращать тег из ранее созданного фрагмента на основе позиции

public Fragment getFragment(int position) { 
    String tag = mFragmentTags.get(position); 
    if (tag == null) 
     return null; 
    return mFragmentManager.findFragmentByTag(tag); 
} 

Внутри FragmentActivity, внутри метода на onPageSelected

Fragment fragment = ((FragmentPageAdapter)viewpager.getAdapter()).getFragment(arg0); 

if (arg0 ==1 && fragment != null) 
{ 
    fragment.onResume(); 
} 

Внутри onResume из ваш фрагмент, обновите listView. Это должно сделать трюк.

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