2014-07-04 2 views
3

Je la mise en oeuvre ActionBar onglet pour afficher 3 comprimés, dont chacune contient un GridLayout. Le problème survient lorsque la vue défile vers le bas, les éléments masqués apparaissent mais l'ordre est brouillé. L'écran ne montre que quatre éléments (initialement dans une grille de colonne 2), mais quand le cinquième est en vue, l'article 1 est affiché à la place, mais le sixième est correcte. Les 7ème et 8ème éléments sont également incorrects et l'erreur est également affichée sur les autres onglets. Faire défiler les onglets dérange aussi l'ordre.applications GridView afficher l'article incorrect et le fragment figurent sur le dessus d'un autre fragment

Jumbled Gridview order

Le deuxième problème se pose lorsque j'implémente onItemClickListener sur chaque élément de la grille, qui est censé remplacer le fragment d'une montre vue plus grande. Au lieu de remplacer la vue, elle se trouve au-dessus de l'écran avec le fragment inférieur visible.

Fragment overlayed

Je ne peux pas comprendre ce qui ne va pas. Voici mon code

Activité principale:

public class MainActivity extends FragmentActivity implements ActionBar.TabListener { 

AppSectionsPagerAdapter mAppSectionsPagerAdapter; 
ViewPager mViewPager; 
public static String[] mTabItems; 
public static int[] mTabImages; 
public static GridView mGridview; 
public static String[][] itemName = new String[3][8]; 
public static int [][] itemPics = new int[3][8]; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mAppSectionsPagerAdapter = new AppSectionsPagerAdapter(getSupportFragmentManager()); 
    final ActionBar actionBar = getActionBar(); 
    actionBar.setHomeButtonEnabled(false); 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

    mViewPager = (ViewPager) findViewById(R.id.pager); 
    mViewPager.setAdapter(mAppSectionsPagerAdapter); 
    mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
     @Override 
     public void onPageSelected(int position) { 
      actionBar.setSelectedNavigationItem(position); 
     } 
    }); 

    for (int i = 0; i < mAppSectionsPagerAdapter.getCount(); i++) { 
     actionBar.addTab(actionBar.newTab().setText(mAppSectionsPagerAdapter.getPageTitle(i)) 
         .setTabListener(this)); 
    } 

    int i = 0; 
    for (int tab = 1; tab<4; tab++){ 
     for (int item = 1; item<9; item++){ 
      String image = "tab" + tab + "_" + item; 
      int imageIden = getResources().getIdentifier(image, "drawable","com.tabgriddrawer"); 
      itemPics[tab-1][item-1] = imageIden; 
      itemName[tab-1][item-1] = image; 
      i++; 
     } 
    } 
} 

@Override 
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
} 

@Override 
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
    mViewPager.setCurrentItem(tab.getPosition()); 
} 

@Override 
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
} 

public static class AppSectionsPagerAdapter extends FragmentPagerAdapter { 

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

    @Override 
    public Fragment getItem(int i) {    
     Fragment frag = new SectionFragment(); 
     Bundle arguments = new Bundle(); 
     arguments.putInt(SectionFragment.ARG_TAB_NUMBER, i); 
     frag.setArguments(arguments); 
     return frag; 
    } 

    @Override 
    public int getCount() { 
     return 3;//set 3 tabs 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return "Tab " + (position + 1); 
    } 
} 

public static class SectionFragment extends Fragment { 

    public static final String ARG_TAB_NUMBER = "tab_number"; 
    public static Bundle detailArguments; 

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

     final Bundle arg = getArguments(); 
     int tab = arg.getInt(ARG_TAB_NUMBER); 
     mTabItems = new String[8]; 
     mTabImages = new int[8]; 

     for (int m=0; m<8; m++){ 
      mTabItems[m] = itemName[tab][m]; 
      mTabImages[m] = itemPics[tab][m]; 
     } 

     View rootView = inflater.inflate(R.layout.fragment_section_gridview, container, false); 
     CustomGrid adapter = new CustomGrid(getActivity().getApplicationContext(), mTabItems,mTabImages); 
     mGridview = (GridView) rootView.findViewById(R.id.fragment_grid_view); 
     mGridview.setAdapter(adapter); 
     mGridview.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view,int position, long id){ 
       int t = arg.getInt(ARG_TAB_NUMBER); 
       Fragment itemDetailFragment = new ItemDetailFragment(); 
       detailArguments = new Bundle(); 
       detailArguments.putString("ItemName", itemName[t][position]); 
       detailArguments.putInt("ImageId", itemPics[t][position]); 
       itemDetailFragment.setArguments(detailArguments); 

       FragmentManager fm = getFragmentManager(); 
       Fragment itemFragment = fm.findFragmentById(R.id.pager); 
       android.support.v4.app.FragmentTransaction ft = fm.beginTransaction(); 
       ft.hide(itemFragment); 
       ft.replace(R.id.drawer_layout, itemDetailFragment, "detail"); 
       ft.commit(); 

      } 
     }); 

     return rootView; 
    } 
} 
} 

adaptateur personnalisé Gridview:

public class CustomGrid extends BaseAdapter{ 
private Context mContext; 
private final String[] libraryItem; 
private final int[] imageId; 

public CustomGrid(Context c,String[] libItem,int[] Imageid) { 
     mContext = c; 
     this.imageId = Imageid; 
     this.libraryItem = libItem; 
    } 
@Override 
public int getCount() { 
    return libraryItem.length; 
} 
@Override 
public Object getItem(int position) { 
    return null; 
} 
@Override 
public long getItemId(int position) { 
    return 0; 
} 
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View grid; 

    LayoutInflater inflater = (LayoutInflater) mContext 
    .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     if (convertView == null) { 
     grid = new View(mContext); 
     grid = inflater.inflate(R.layout.fragment_gridview_item, null); 
     TextView textView = (TextView) grid.findViewById(R.id.txtItemName); 
     ImageView imageView = (ImageView)grid.findViewById(R.id.imageItem); 
     textView.setText(libraryItem[position]); 
     imageView.setImageResource(imageId[position]); 
     } else { 
     grid = (View) convertView; 
     } 
    return grid; 
} 

}

Détail de l'article Fragment:

public class ItemDetailFragment extends Fragment { 

private Context mContext; 
private String mItemDesc; 
private int mImageId; 
private String mItemName; 
static int tab; 
static int position; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 
     View view = inflater.inflate(R.layout.fragment_item_detail, container, false); 
     ImageView image = (ImageView)view.findViewById(R.id.itemimage); 
     image.setImageResource(mImageId); 
     TextView itemtext = (TextView)view.findViewById(R.id.itemName); 
     itemtext.setText(mItemName); 
     return view; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     ActionBar actionBar = getActivity().getActionBar(); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); 

     mImageId = (int)MainActivity.SectionFragment.detailArguments.getInt("ImageId"); 
     mItemName = (String)MainActivity.SectionFragment.detailArguments.get("ItemName"); 
     } 

    public void onBackPressed(){ 
     FragmentTransaction ft = getFragmentManager().beginTransaction(); 
     ft.replace(R.id.main_frame, new MainActivity.SectionFragment()); 
     ft.addToBackStack(null); 
     ft.commit(); 
     } 
} 

XML principal

<android.support.v4.widget.DrawerLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/drawer_layout" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<!-- moved viewpager to inside drawer layout --> 
<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/pager" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
</android.support.v4.view.ViewPager> 

<FrameLayout 
    android:id="@+id/content_frame" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

<ListView 
    android:id="@+id/left_drawer" 
    android:layout_width="240dp" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    android:choiceMode="singleChoice" 
    android:divider="@android:color/transparent" 
    android:dividerHeight="0dp" 
    android:background="#111"/> 
</android.support.v4.widget.DrawerLayout> 

XML Gridview

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/main_frame" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<GridView 
    android:id="@+id/fragment_grid_view" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:columnWidth="90dp" 
    android:gravity="center" 
    android:horizontalSpacing="10dp" 
    android:numColumns="2" 
    android:stretchMode="columnWidth" 
    android:verticalSpacing="10dp" > 

</GridView> 

Répondre

2

Je n'ai pas regardé votre code entier. . . seulement la méthode getView dans votre adaptateur, parce que c'est là que je soupçonne que le problème est.

Lorsque le convertView n'est pas nul, vous renvoie simplement convertView. . . c'est ce qui cause le problème. Lorsque vous faites cela, vous renvoyez une vue que l'adaptateur tente de recycler d'une position de grille à l'autre. C'est pourquoi l'image d'une vue apparaît dans une autre. Au lieu de cela, faites ceci:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View grid; 

    LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     if (convertView == null) { 
     grid = new View(mContext); 
     grid = inflater.inflate(R.layout.fragment_gridview_item, null); 
     } else { 
     grid = (View) convertView; 
     } 

     TextView textView = (TextView) grid.findViewById(R.id.txtItemName); 
     ImageView imageView = (ImageView)grid.findViewById(R.id.imageItem); 
     textView.setText(libraryItem[position]); 
     imageView.setImageResource(imageId[position]); 
    return grid; 
} 
Questions connexes