2014-11-05 84 views
0

我有GridView的問題。我用它作爲我的應用程序的菜單。我創建了一個自定義適配器,將菜單項顯示爲下面帶有標籤的圖片。問題是,沒有任何理由,第一張圖片和標籤被分配到第10個項目,你可以在圖片中看到(的picures只是佔位,直到我畫我自己):GridView複製隨機項目

http://imgur.com/yrb1gRB

我不知道是什麼導致了這種情況,特別是當我點擊菜單中的一些可用項目,然後按下後退按鈕返回到菜單時,問題奇蹟般地消失。

這裏是我的代碼:

public class MainMenuFragment extends Fragment implements OnItemClickListener{ 
    GridView grid; 
    FragmentManager manager; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View root = inflater.inflate(R.layout.main_menu_fragment, container, false); 

    manager = getActivity().getFragmentManager(); 
    grid = (GridView) root.findViewById(R.id.gridView1); 

    grid.setAdapter(new MenuTileAdapter(getActivity())); 
    grid.setOnItemClickListener(this); 

    return root; 
} 
@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    FragmentTransaction trans = manager.beginTransaction(); 
    switch (position){ 
     case 0: 
      trans.replace(R.id.frag_container, new BasicSettingsFragment()); 
      trans.addToBackStack(null); 
      trans.commit(); 
      break; 
     case 1: 
      trans.replace(R.id.frag_container, new StretchingFragment()); 
      trans.addToBackStack(null); 
      trans.commit(); 
      break; 
     case 2: 
      trans.replace(R.id.frag_container, new SqueezingFragment()); 
      trans.addToBackStack(null); 
      trans.commit(); 
      break; 
     case 3: 
      trans.replace(R.id.frag_container, new BendingFragment()); 
      trans.addToBackStack(null); 
      trans.commit(); 
      break; 
     case 4: 
      trans.replace(R.id.frag_container, new CrackBrickingFragment()); 
      trans.addToBackStack(null); 
      trans.commit(); 
      break; 
     case 5: 
      trans.replace(R.id.frag_container, new TraverseDeformationFragment()); 
      trans.addToBackStack(null); 
      trans.commit(); 
      break; 
     case 6: 
      trans.replace(R.id.frag_container, new CuttingFragment()); 
      trans.addToBackStack(null); 
      trans.commit(); 
      break; 
     default: 
      break; 
    } 
} 
} 

這裏是MenuTileAdapter的getView方法:

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

    if (convertView == null){ 
     gridView = new View(context); 
     gridView = inflater.inflate(R.layout.menu_tile, null); 

     TextView label = (TextView) gridView.findViewById(R.id.textView1); 
     ImageView icon = (ImageView) gridView.findViewById(R.id.imageView1); 

     label.setText(this.labels[position]); 
     switch (position){ 
     case 0: 
      icon.setImageResource(R.drawable.a1); 
      break; 
     case 1: 
      icon.setImageResource(R.drawable.a2); 
      break; 
     case 2: 
      icon.setImageResource(R.drawable.a3); 
      break; 
     case 3: 
      icon.setImageResource(R.drawable.a4); 
      break; 
     case 4: 
      icon.setImageResource(R.drawable.a5); 
      break; 
     case 5: 
      icon.setImageResource(R.drawable.a6); 
      break; 
     case 6: 
      icon.setImageResource(R.drawable.a7); 
      break; 
     case 7: 
      icon.setImageResource(R.drawable.a8); 
      break; 
     case 8: 
      icon.setImageResource(R.drawable.a9); 
      break; 
     case 9: 
      icon.setImageResource(R.drawable.a10); 
      break; 
     case 10: 
      icon.setImageResource(R.drawable.a11); 
      break; 
     case 11: 
      icon.setImageResource(R.drawable.a12); 
      break; 
     } 
    } else { 
     gridView = convertView; 
    } 
    return gridView; 
} 

我已經通過這個代碼走了hundread次,我什麼也看不到會導致此奇怪的問題。

回答

1

這部分就在這裏

if (convertView == null){ 
    gridView = new View(context); 
    gridView = inflater.inflate(R.layout.menu_tile, null); 

    TextView label = (TextView) gridView.findViewById(R.id.textView1); 
    ImageView icon = (ImageView) gridView.findViewById(R.id.imageView1); 

    label.setText(this.labels[position]); 
    switch (position){ 
    case 0: 
     icon.setImageResource(R.drawable.a1); 
     break; 
    case 1: 
     icon.setImageResource(R.drawable.a2); 
     break; 
    case 2: 
     icon.setImageResource(R.drawable.a3); 
     break; 
    case 3: 
     icon.setImageResource(R.drawable.a4); 
     break; 
    case 4: 
     icon.setImageResource(R.drawable.a5); 
     break; 
    case 5: 
     icon.setImageResource(R.drawable.a6); 
     break; 
    case 6: 
     icon.setImageResource(R.drawable.a7); 
     break; 
    case 7: 
     icon.setImageResource(R.drawable.a8); 
     break; 
    case 8: 
     icon.setImageResource(R.drawable.a9); 
     break; 
    case 9: 
     icon.setImageResource(R.drawable.a10); 
     break; 
    case 10: 
     icon.setImageResource(R.drawable.a11); 
     break; 
    case 11: 
     icon.setImageResource(R.drawable.a12); 
     break; 
    } 
} else { 
    gridView = convertView; 
} 

如果convertView不爲空,你只要給它沒有把圖像和文字應該去什麼在那裏

+0

哦回收的觀點,這就是正確的。我刪除了if語句,即使'convertView'不爲null,它現在也會重新創建View。或者也許有更好的解決方案?無論如何,謝謝你的幫助! – jammaster 2014-11-05 18:21:34

+0

是的,不要那樣做,只檢查contentView是否爲空。如果這只是誇大了觀點。之後做所有事情 – tyczj 2014-11-05 18:23:30