2016-10-30 92 views
0

我有一個單詞列表。我希望列表中每個單詞的字母在GridView中顯示爲圖像。如何將GridView添加到ListView中

我已經通過爲我的單詞列表創建自定義適配器WordListAdapter來實現了此工作版本。對於每個單詞,WordListAdapter.getView反過來調用一個自定義適配器LetterImageAdapter,以在單詞中顯示字母。由於我是Android編程新手,我想知道這是否是一種好方法。它確實看起來像很多工作。如果這是一個好方法,那麼這對其他人可能會有所幫助。

我見過很多關於ListViews裏GridVeiws的其他文章。他們中的很多人都提到了滾動和內存方面的問題,但我沒有看到這個用例特有的任何問題。

在我的活動:

@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

我建議使用LinearLayoutImageView小號而不是GridView來保存這些字母。

雖然技術上中可能有GridViewGridView是相當複雜的對象,但它更適合作爲主要列表而不是可回收的子項目。在回收主要項目時,您會遇到複雜的問題,因爲每個GridView都有自己的適配器。

因此,字母的數量相當有限,LinearLayout(也許在HorizontalScrollView內)是一種更簡單的方法。你甚至可以緩存信位圖,或把它們作爲資源,所以他們通過在LinearLayout小號

要做好相關的你的意圖的東西都ImageViews共享,你最好在RecyclerView更好看,那是怎麼樣的一個抽象的項目列表容器,你可以設置做各種複雜的佈局。但作爲初學者,我建議先掌握簡單的ListView/GridView,然後在瞭解View回收工作原理時轉入RecyclerView

+0

謝謝!所以這聽起來好像我需要在LinearLayout中使用一個ListView,這樣我可以遍歷這些圖像。順便說一句,我檢查接受你的答案,但沒有看到投票。 – user6627139

+0

其實我的意思是LinearLayouts圖像作爲ListView項目。我的重點是避免嵌套列表窗口小部件 – rupps