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
@Mike M. J'ai utilisé Log.d pour vérifier, les deux mises à jour de tempList correctement – phoon
Oui, je n'ai pas vu vos méthodes 'update()' au début, donc j'ai supprimé mon commentaire. –
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). –