2016-10-30 14 views
0

私は単語のリストを持っています。リスト内の各単語の文字をGridViewに画像として表示したい。GridViewをListViewに追加する方法

私は単語のリストのために、カスタムアダプタ、WordListAdapterを作成することでこれの作業バージョンを実装しました。各単語について、WordListAdapter.getViewはカスタムアダプタLetterImageAdapterを呼び出して、単語に文字を表示します。私はAndroidプログラミングが初めてのので、これが良いアプローチであるかどうかは疑問です。確かに多くの仕事のようです。それが良いアプローチであれば、おそらくこれは他の人に役立つでしょう。

私はListView内のGridVeiwについて他にも多くの記事を見てきました。多くの人がスクロールとメモリに関する問題に触れていましたが、このユースケースに特有の問題はありませんでした。私の活動で

@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とSを使用することをお勧めしたいです文字を保持するためにGridViewの代わりに。

GridViewを技術的にはListViewに含めることができますが、GridViewはかなり複雑なオブジェクトで、リサイクル可能な子アイテムよりもメインリストに適しています。すべてのGridViewには独自のアダプタが用意されているため、メインアイテムをリサイクルするときには複雑な問題が発生します。

文字の数がかなり限られているので、LinearLayout(多分HorizontalScrollViewの中にあります)ははるかに簡単な方法です。文字ビットマップをキャッシュすることも、リソースとして含めることもできます。LinearLayout

あなたの意向に関係することをするには、RecyclerViewを見てください。すべての種類の複雑なレイアウトを行うために設定できる抽象的な項目リストコンテナです。初心者であれば、より簡単にマスターすることをお勧めします。ListView/GridView次に、Viewリサイクルの仕組みを理解したら、RecyclerViewに移動してください。

+0

ありがとうございます!ですから、LinearLayoutの内部でListViewが必要なように聞こえるので、画像を繰り返し処理することができます。 btw、私はあなたの答えを受け入れるようにチェックしましたが、投票は見ません。 – user6627139

+0

実際、私はリストビューアイテムとして画像を持つLinearLayoutsを意味していました。私の重要なポイントは、ネストされたリストウィジェットを避けることです – rupps

関連する問題