我有一个单词列表。我希望列表中每个单词的字母在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);
}
}
答案 0 :(得分:1)
我建议使用LinearLayout
ImageView
而不是GridView
来保存这些字母。
虽然技术上可以在GridView
内部ListView
,但GridView
是非常复杂的对象,更适合作为主要列表而不是可回收的子项。回收主要项目时会遇到复杂的问题,因为每个GridView都有自己的适配器。
因为字母数量非常有限,LinearLayout
(可能在HorizontalScrollView
内)是一种更简单的方法。您甚至可以缓存字母位图,或将它们作为资源包含在内,以便ImageViews
中的所有LinearLayout
共享它们
要做一些与您的意图相关的事情,您最好查看RecyclerView,这是一种抽象项目列表容器,您可以设置它来执行各种复杂的布局。但作为一名初学者,我建议您首先掌握更简单的ListView
/ GridView
,然后在了解View回收的工作原理时进入RecyclerView
。