2011-07-01 8 views
2

BaseAdapterを拡張したカスタムImageAdapterクラスを使用して配置されたグリッドビューがあります。 イメージは、SDカード内の特定のフォルダから動的にロードされます。私はそれらのpostition(1.png、2.pngなど)に従って画像に名前を付けました。グリッド項目にはOnClickListenerを設定しました。画像と同じ名前のオーディオファイルがSDカードから再生されます。Android gridview:多数の画像を表示しているときにエラーが発生しました

画像の枚数が少なく、画面に合っているとうまく動作します。

数字が大きく、画像が画面に収まらない場合、画面を下にスクロールして表示される次の行のセットは、ほとんどの場合、対応する位置の画像ではなく最初の数行からの画像の繰り返しです。

Iは、アダプタクラスのgetView()機能のみ、下方にスクロールしながら、時にはさらに位置も

ために適切に呼び出されていない、その画面上に表示され、画像に対して最初に呼び出されることlogcatから見つけます画像全体が再配置されます。 多数の画像を適切に表示するために、グリッドビューの基本的な実装と異なるものを実行する必要がありますか?私が世話しなければならないことは何かありますか?

EDIT - CODE

私はこれが

@Override 
public int getCount() { 
    // fileNames is a string array containing the image file names : 1.png, 2.png etc 
    return fileNames.length; 
} 

@Override 
public Object getItem(int position) { 
    return null; 
} 

@Override 
public long getItemId(int position) { 
    // I did not use this function 
    return 0; 
} 
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 
    View v; 
    if(convertView==null) { 
     LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = inflater.inflate(R.layout.grid_image, null); 
     ImageView iv = (ImageView)v.findViewById(R.id.icon_image); 
     String bitmapFileName = fileNames[position]; 
     Bitmap bmp =(Bitmap)BitmapFactory.decodeFile(dir.getPath() + "/" + bitmapFileName);a 
     iv.setImageBitmap(bmp); 
    } 
    else { 
    v = convertView; 
    } 
    return v; 
} 

画像アダプタクラスです

tabGrid[i].setAdapter(new ImageAdapter(this,i)); 

を使用して、各タブを設定していgetItem()getItemId()機能は重要ですか?ディレクトリとファイル名はすべて有効です。

+0

何か問題が起きる可能性があることを確認するためにコードを投稿する可能性はありますか? :) – Gregory

+0

@Gregory:\t それを見ていただきありがとうございます。私はコードを追加しました。qnが長すぎるため、最初のコードを追加しました。 –

答えて

5

ここではすばやく修正する必要があります。

@Override 
public String getItem(int position) { 
    return fileNames[position]; 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View v; 
    if(convertView==null) { 
     LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = inflater.inflate(R.layout.grid_image, parent, false); 
    } 
    else { 
     v = convertView; 
    } 

    ImageView iv = (ImageView)v.findViewById(R.id.icon_image); 
    String bitmapFileName = getItem(position); 
    Bitmap bmp =(Bitmap)BitmapFactory.decodeFile(dir.getPath() + "/" + bitmapFileName);a 
    iv.setImageBitmap(bmp); 

    return v; 
} 
  1. 私はそれが必要な100%ではないのですが、それはそれを持っていることは常に良いでしょう、のgetItemを満たしました。残りのアダプタコードはそれに頼ることができます
  2. アイテムIDは各エントリごとに異なる必要があります。getItem(position).hashCode()(遅いかもしれません)または単に返す位置)。
  3. getViewメソッドは少し難解です。変換ビューがnullの場合、それを作成するという考え方です。そして、どの場合でも、ビューのコンテンツを設定します。
  4. getView項目のinflateは、親を親として使用する必要があります。また、新しいビューを親に追加しないようにシステムに指示するために「false」があります(gridviewはそれを処理します)。そうしないと、一部のレイアウトパラメータが無視されることがあります。

ビューはリサイクルされていたため(convertView not null)、それらのコンテンツを設定していなかったため、あなたがしたエラーがありました。希望が助けてくれる!

+0

'v = inflater.inflate(R.layout.grid_image、parent、false ) 'いくつかの絵を小さくしましたが、' v = inflater.inflate(R。layout.grid_image、null) '画像が正しく表示されている場所。 @Gregory –

+1

@ jerrin-george "parent、false"を使用すると、layout_width(およびheightと "layout_"で始まるもの)を使用してレイアウトのサイズを設定しますが、使用しない場合はおそらく落ちます"wrap_content"に戻り、画像のサイズ変更を試みません。可能であれば、あなたは親を偽のバージョンにしてレイアウトを修正するべきだと思う傾向があります。 – Gregory

+0

この4点を説明していただきありがとうございます – Manju

関連する問題