2016-01-16 14 views
6

ci sono 3 schede: ONE || TWO || TRIElenco dati duplicato dopo passare ad altro frammento (scheda scorrevole)

esempio: myList = 1,2,3

problema:

dopo vado alla pagina DUE myList = 1,2,3,1,2,3 (doppio duplicato)

se vado alla pagina TRI myList = 1,2,3,1,2,3,1,2,3 (tri ple duplicato)

dopo che ho cercando la soluzione su internet, ho trovato questo codice (dalla classe adattatore):

public void swap(List<FoodModel> datas){ 
     datas = new ArrayList<>();//updated 
     if(mListFood !=null || mListFood.size() !=0){ 
      mListFood.clear(); 
      mListFood.addAll(datas); 
     }else{ 
      mListFood = datas; 
     } 
     notifyDataSetChanged(); 
    } 

ho usato come questo in oneFragment.java:

mListFoodAdapter = new ListFoodAdapter(getContext(), mFoodModel); 
     mListFoodAdapter.swap(mFoodModel); 
     mRecyclerViewListFood.setLayoutManager(linearLayoutManager); 
     mRecyclerViewListFood.setAdapter(mListFoodAdapter); 
     mRecyclerViewListFood.setItemAnimator(new DefaultItemAnimator()); 

ma ha dato me nullPointer a volte non ci sono dati mostrano in RecyclerView

per favore, suggerirmi come rendere i dati della lista non sono più duplicati dopo bac k da pag DUE di TRI

muggito miei codici oneFragment.java e ViewPagerAdapter.java

oneFragment.java

public class FoodFragment extends Fragment { 

    private RecyclerView mRecyclerViewListFood; 
    private List<FoodModel> mFoodModel = new ArrayList<>(); 
    private ListFoodAdapter mListFoodAdapter; 

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

    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 
     FragmentActivity fragmentActivity = getActivity(); 
     LinearLayoutManager linearLayoutManager = new LinearLayoutManager(fragmentActivity); 
     mRecyclerViewListFood = (RecyclerView) view.findViewById(R.id.recyclerView_list_foods); 
     mFoodModel.add(new FoodModel("1",String.valueOf(R.drawable.icon), "test 1")); 
     mFoodModel.add(new FoodModel("2",String.valueOf(R.drawable.icon), "test 2")); 

     mListFoodAdapter = new ListFoodAdapter(getContext(), mFoodModel); 
     mRecyclerViewListFood.setLayoutManager(linearLayoutManager); 
     mRecyclerViewListFood.setAdapter(mListFoodAdapter); 
     mRecyclerViewListFood.setItemAnimator(new DefaultItemAnimator()); 



    } 
} 

ViewPagerAdapter.java:

public class ViewPagerDetailStandAdapter extends FragmentStatePagerAdapter { 

    private final List<Fragment> mFragmentList = new ArrayList<>(); 
    private final List<String> mFragmentTitleList = new ArrayList<>(); 

    public ViewPagerDetailStandAdapter(FragmentManager manager) { 
     super(manager); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return mFragmentList.get(position); 
    } 

    @Override 
    public int getCount() { 
     return mFragmentList.size(); 
    } 

    public void addFragment(Fragment fragment, String title) { 
     mFragmentList.add(fragment); 
     mFragmentTitleList.add(title); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return mFragmentTitleList.get(position); 
    } 
} 
+0

Sì, inserisci il tuo adattatore e il codice frammento – chandil03

+0

@ chandil03 ho modificato i miei codici, si prega di rivedere i miei codici. –

risposta

3

C'è un problema nel metodo onViewCreated(). Il metodo OnViewCreated() viene chiamato ogni volta che viene creata la vista di frammento. Ma il frammento viene riutilizzato se è in memoria. Questo è il motivo per cui l'elenco mFoodModel non viene reinizializzato. Quindi è necessario reinizializzare mFoodModel per creare dati precedenti.

Quindi questa è la tua modificato OnCreateView() `

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    FragmentActivity fragmentActivity = getActivity(); 
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(fragmentActivity); 
    mRecyclerViewListFood = (RecyclerView) view.findViewById(R.id.recyclerView_list_foods); 
    mFoodModel = new ArrayList<>(); // initialize you list 
    mFoodModel.add(new FoodModel("1",String.valueOf(R.drawable.icon), "test 1")); 
    mFoodModel.add(new FoodModel("2",String.valueOf(R.drawable.icon), "test 2")); 

    mListFoodAdapter = new ListFoodAdapter(getContext(), mFoodModel); 
    mRecyclerViewListFood.setLayoutManager(linearLayoutManager); 
    mRecyclerViewListFood.setAdapter(mListFoodAdapter); 
    mRecyclerViewListFood.setItemAnimator(new DefaultItemAnimator()); 
} 
+0

grazie @ chandil03, ho usato 'mFoodModel = new ArrayList <>();' nel mio adattatore (nel codice che ho detto come soluzione, cek ha aggiornato le domande) cosa li rende diversi? –

+0

'Il metodo OnViewCreated()' viene chiamato ogni volta che viene caricato un frammento in cui si aggiungono elementi. più e più volte si carica il codice, il codice aggiungerà gli stessi elementi nell'elenco. Poiché il frammento è stato riutilizzato, l'istruzione di inizializzazione dell'elenco mFoodModel viene inizializzata solo una volta.È necessario reinizializzare nuovamente l'elenco o cancellare i dati dall'elenco nel metodo 'OnViewCreated' per risolvere il problema. – chandil03

1

basta usare questo metodo per cancellare i dati di frammenti.

@Override 
public void onDestroyView() { 
    super.onDestroyView(); 
    tutPojo.clear(); 
} 
Problemi correlati