2014-11-05 83 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