如何将GridView添加到ListView

时间:2016-10-30 21:10:16

标签: android listview gridview

我有一个单词列表。我希望列表中每个单词的字母在gridview中显示为图像。

我已经通过为我的单词列表创建自定义适配器WordListAdapter来实现了这个的工作版本。对于每个单词,WordListAdapter.getView依次调用自定义适配器LetterImageAdapter来显示单词中的字母。由于我是Android编程新手,我想知道这是否是一个好方法。这看起来确实很多。如果这是一个好方法,也许这会对其他人有所帮助。

我在listviews中看到了很多关于gridviews的帖子。他们中的许多人都涉及滚动和内存问题,但我没有看到任何特定的用例。

在我的活动中:

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_game);
    ListView listView = (ListView) findViewById(R.id.wordList);
    listView.setAdapter(new WordListAdapter(this, new String[]{"ABC", "DEF"}));
 }

WordListAdapter.getView()

public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.word_grid, null);
        GridView gridView = (GridView) convertView.findViewById(R.id.word_grid_id);
        holder = new ViewHolder();
        holder.gridView = gridView;

        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }
    holder.gridView.setAdapter(new LetterImageAdapter(mContext, words[position]));
    return convertView;
}

private static class ViewHolder {
    GridView gridView;
}

LetterImageAdapter.getView()

public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.letter_item, null);
        holder = new ViewHolder();
        holder.icon = (ImageView) convertView.findViewById(R.id.list_item_letter_imageview);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }
    // resource for each letter is in lettersId array
    holder.icon.setImageResource(letterIds[position]);
    return convertView;
}

private static class ViewHolder {
    ImageView icon;
}

// transform word into array of resources for each letter
private void buildResourceArray(String packageName) {
    letterIds = new int[theWord.length()];
    for (int index = 0; index < theWord.length(); index++) {
        letterIds[index] = getResourceId(theWord.substring(index, index + 1).toLowerCase(), "drawable", packageName);
    }
 }

1 个答案:

答案 0 :(得分:1)

我建议使用LinearLayout ImageView而不是GridView来保存这些字母。

虽然技术上可以在GridView内部ListView,但GridView是非常复杂的对象,更适合作为主要列表而不是可回收的子项。回收主要项目时会遇到复杂的问题,因为每个GridView都有自己的适配器。

因为字母数量非常有限,LinearLayout(可能在HorizontalScrollView内)是一种更简单的方法。您甚至可以缓存字母位图,或将它们作为资源包含在内,以便ImageViews中的所有LinearLayout共享它们

要做一些与您的意图相关的事情,您最好查看RecyclerView,这是一种抽象项目列表容器,您可以设置它来执行各种复杂的布局。但作为一名初学者,我建议您首先掌握更简单的ListView / GridView,然后在了解View回收的工作原理时进入RecyclerView