1

Ich habe 2 Fragmente, beide arbeiten mit Array-Adapter, um ihre Kategorie anzuzeigen. Das erste Fragment ist eine Anzeigeelementkategorie, das zweite Fragment ist eine Anzeigeauftragskategorie. Es zeigt jedoch die Jobkategorie in beiden Fragmenten an. Ich weiß nicht, welcher Teil schief läuft.Android ArrayAdapter getView kann nicht die richtige Position

Dies ist mein ViewPager, um das Fragment anzuzeigen, wenn der Benutzer die entsprechende Registerkarte auswählt. Die setCategory() wird aufgerufen, wenn die Daten aus der Datenbank empfangen werden.

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()+""); 
} 
} 

Dies ist das Fragment Positionstyp Job Kategorie anzuzeigen

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()); 
    } 

} 
} 

Beide Fragment CategoryGridAdapter Kategorie genannt werden

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()); 
    } 
    } 

Dies ist das Fragment zum Anzeigen auf Gridview anzuzeigen

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; 
} 

Ich erwarte, dass die Elementkategorie im Ansichts-Pager angezeigt wird, wenn der Benutzer die Registerkarte und die Jobkategorie im Ansichts-Pager auswählt, wenn der Benutzer die Job-Registerkarte auswählt, aber nur die Job-Kategorie anzeigt. Hat jemand diesbezüglich Lösungen? Dank

+0

@Mike M. Ich habe mit Log.d zu überprüfen, beide TempList korrekt aktualisieren – phoon

+0

Ja, ich habe nicht Ihre 'update()' Methoden zuerst, so dass ich meinen Kommentar gelöscht. –

+0

Oh, ich sehe es jetzt. Beide Ihrer 'Fragment's verwenden die gleiche 'List categoryList', die Sie im' ViewPagerAdapter' definiert haben, und übergeben ihre Konstruktoren. Tu das nicht. Erstellen Sie einfach eine neue 'ArrayList ' in jedem, und entfernen Sie diesen Parameter aus dem Konstruktor (er sollte sowieso nicht da sein). –

Antwort

3

In der ViewPagerAdapter Klasse, haben Sie eine List<Category> categoryList, die Sie beide Fragment s in ihren Konstrukteuren vorbei sind, und jeder Fragment ist die gleiche Liste wie der Daten-Set zu setzen. Die Log-Prints, die Sie in den Methoden und update() haben, scheinen nur korrekt zu sein, da die Updates sequenziell ausgeführt werden und Sie die Liste dazwischen löschen.

Anstatt die List zu jedem Fragment zu übergeben, müssen Sie einfach jeweils einen eigenen neuen ArrayList<Category> erstellen und diesen Parameter aus jedem Konstruktor entfernen.

Verwandte Themen