1

J'ai 2 fragments, les deux fonctionnent avec l'adaptateur de tableau pour afficher leur catégorie. Le premier fragment est la catégorie d'élément d'affichage, le deuxième fragment est la catégorie d'emploi d'affichage. Cependant, il affiche la catégorie de travail dans les deux fragments. Je ne sais pas quelle partie va mal.Android ArrayAdapter getView ne peut pas obtenir la position correcte

Ceci est mon ViewPager pour afficher le fragment lorsque l'utilisateur sélectionne l'onglet correspondant. La setCategory() sera appelée lors de la réception des données de la base de données.

public class ViewPagerAdapter extends FragmentPagerAdapter { 

private List<Category> categoryList = new ArrayList(); 
private DisplayItemFragment itemFragment; 
private DisplayJobFragment jobFragment; 

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

@Override 
public Fragment getItem(int position) { 
    Log.d("categoryList", categoryList.size()+" "); 
    if (position ==0) { 
     itemFragment = new DisplayItemFragment(categoryList); 
     return itemFragment; 
    }else{ 
     jobFragment = new DisplayJobFragment(categoryList); 
     return jobFragment; 
    } 

} 

@Override 
public int getCount() { 
    return 2; 
} 

@Override 
public CharSequence getPageTitle(int position) { 
    switch (position){ 
     // 
     //Your tab titles 
     // 
     case 0:return "Item"; 
     case 1:return "Job"; 
     default:return null; 
    } 
} 

public void setCategory(List<Category> list){ 
    List<Category> tempList = new ArrayList(); 
    for(int i=0;i<list.size();i++){ 
     if(list.get(i).getType().equals("item")){ 
      tempList.add(list.get(i)); 
     } 
    } 
    itemFragment.update(tempList); 
    Log.d("this.categoryListitem",tempList.size()+""); 
    tempList.clear(); 
    for(int i=0;i<list.size();i++){ 
     if(list.get(i).getType().equals("job")){ 
      tempList.add(list.get(i)); 
     } 
    } 
    jobFragment.update(tempList); 
    Log.d("this.categoryListjob",tempList.size()+""); 
} 
} 

C'est le fragment pour afficher l'article catégorie

public class DisplayItemFragment extends Fragment { 

private View rootView; 
private GridView gridView; 
private List<Category> categoryList; 
private DisplayFragmentPresenter presenter; 
private CategoryGridAdapter categoryAdapter; 
private TextView text; 

public DisplayItemFragment(List<Category> categoryList) { 
    this.categoryList=categoryList; 
} 

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

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

    rootView = inflater.inflate(R.layout.fragment_display, container, false); 
    text = (TextView) rootView.findViewById(R.id.test); 
    categoryAdapter = new CategoryGridAdapter(getActivity(), R.layout.fragment_display, categoryList); 
    gridView = (GridView) rootView.findViewById(R.id.gridview); 
    gridView.setAdapter(categoryAdapter); 
    gridView.setTextFilterEnabled(true); 

    //Log.d("category",categoryList.get(0).getName()); 
    return rootView; 
} 

public void update(List<Category> list) { 
    this.categoryList.clear(); 
    for(int i=0;i<list.size();i++){ 
     if(list.get(i).getType().equals("item")){ 
      this.categoryList.add(list.get(i)); 
     } 
    } 
    text.setText("item refresh"); 
    for(int i=0;i<this.categoryList.size();i++){ 
     Log.d("categoryListitem",categoryList.get(i).getName()); 
    } 
    } 

C'est le fragment pour afficher la catégorie d'emploi

public class DisplayJobFragment extends Fragment { 

private View rootView; 
private GridView gridView; 
private List<Category> categoryList; 
private DisplayFragmentPresenter presenter; 
private TextView text; 
private CategoryGridAdapter categoryAdapter; 

public DisplayJobFragment(List<Category> categoryList) { 
    this.categoryList=categoryList; 
} 



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

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

    rootView = inflater.inflate(R.layout.fragment_display, container, false); 
    text = (TextView) rootView.findViewById(R.id.test); 
    categoryAdapter = new CategoryGridAdapter(getActivity(), R.layout.fragment_display, categoryList); 
    gridView = (GridView) rootView.findViewById(R.id.gridview); 
    gridView.setAdapter(categoryAdapter); 
    gridView.setTextFilterEnabled(true); 

    //Log.d("category",categoryList.get(0).getName()); 
    return rootView; 
} 

public void update(List<Category> list) { 
    this.categoryList.clear(); 
    for(int i=0;i<list.size();i++){ 
     if(list.get(i).getType().equals("job")){ 
      this.categoryList.add(list.get(i)); 
     } 
    } 
    text.setText("job refresh"); 
    //categoryAdapter = new CategoryGridAdapter(getActivity(), R.layout.fragment_display, this.categoryList); 
    for(int i=0;i<this.categoryList.size();i++){ 
     Log.d("categoryListjob",categoryList.get(i).getName()); 
    } 

} 
} 

deux fragment sera appelé CategoryGridAdapter pour afficher la catégorie sur gridview

public class CategoryGridAdapter extends ArrayAdapter<Category> { 

private List<Category> categoryList; 
private Context context; 

public CategoryGridAdapter(Context context, int resource, List<Category> categoryList) { 
    super(context, resource, categoryList); 
    this.context = context; 
    this.categoryList = categoryList; 
} 

@Override 
public boolean isEnabled(int position) { 
    return true; 
} 

@Override 
public int getCount() { 
    return ((null != categoryList) ? 
      categoryList.size() : 0); 
} 

@Override 
public Category getItem(int position) { 
    return ((null != categoryList) ? 
      categoryList.get(position) : null); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View view = convertView; 
    LayoutInflater layoutInflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    if (null == view) { 
     view = layoutInflater.inflate(R.layout.grid_category, null); 
    } 

    final Category category = categoryList.get(position); 
    Log.d("categorygridlist",category.getName()+" "+position+ " " + categoryList.size()); 

    if (category != null) { 
     final CardView categoryGridLayout = (CardView) view.findViewById(R.id.category_gridlayout); 
     final TextView categoryName = (TextView) view.findViewById(R.id.category_name); 
     final ImageView categoryIcon = (ImageView) view.findViewById(R.id.category_icon); 

     categoryName.setText(category.getName()); 
     categoryName.setSelected(true); 
     try { 
      byte[] decodedString = Base64.decode(category.getImage(), Base64.DEFAULT); 
      BitmapFactory.Options options=new BitmapFactory.Options();// Create object of bitmapfactory's option method for further option use 
      options.inPurgeable = true; // inPurgeable is used to free up memory while required 
      Bitmap decodedByte1 = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);//Decode image, "thumbnail" is the object of image file 
      Bitmap decodedByte = Bitmap.createScaledBitmap(decodedByte1, 50 , 50 , true);// convert decoded bitmap into well scalled Bitmap format. 

      categoryIcon.setImageBitmap(decodedByte); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     categoryGridLayout.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Toast.makeText(context, "worked", Toast.LENGTH_LONG).show(); 
      } 
     }); 
    } 

    return view; 
} 

Je m'attends à ce qu'il affiche la catégorie d'élément à pager de vue quand l'utilisateur choisissent l'étiquette d'article et la catégorie de travail au pager de vue quand l'utilisateur choisissent l'étiquette de travail mais elle n'affiche que la catégorie de travail. Quelqu'un at-il des solutions à ce sujet? Merci

+0

@Mike M. J'ai utilisé Log.d pour vérifier, les deux mises à jour de tempList correctement – phoon

+0

Oui, je n'ai pas vu vos méthodes 'update()' au début, donc j'ai supprimé mon commentaire. –

+0

Oh, je le vois maintenant. Les deux de vos 'Fragment's utilisent la même' Liste categoryList' que vous avez définie dans 'ViewPagerAdapter', et transmettent leurs constructeurs. Ne fais pas ça. Créez simplement un nouveau 'ArrayList ' dans chacun, et supprimez ce paramètre du constructeur (il ne devrait pas être là, de toute façon). –

Répondre

3

Dans la classe ViewPagerAdapter, vous avez une List<Category> categoryList que vous passez aux deux Fragment s dans leurs constructeurs, et chaque Fragment met la même liste que son ensemble de données. Les impressions de journal que vous avez dans les méthodes setCategory() et update() ne semblent correctes que parce que les mises à jour se déroulent de manière séquentielle et que vous effacez la liste entre les deux.

Au lieu de passer que List à chaque Fragment, ont juste chacun crée sa propre ArrayList<Category>, et supprimer ce paramètre de chaque constructeur.