2

BaseAdapterを拡張するカスタムImageAdapterクラスを使用して入力されたグリッドビューがあります。画像はSDカードの特定のフォルダから動的に読み込まれます。位置(1.png、2.pngなど)に従って画像に名前を付けました。グリッドアイテムにもを設定しOnClickListenerました。画像と同じ名前のオーディオファイルがSDカードから再生されます。

画像の数が少なく、画面に収まる場合にうまく機能します。

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

logcatからgetView()、アダプタクラスの関数は、最初は画面に表示されている画像に対してのみ呼び出され、下にスクロールしている間は、それ以降の位置に対して適切に呼び出されないことがわかりました。

また、画像のセット全体が再配置されることもあります。多数の画像を適切に表示するために、グリッドビューの基本的な実装とは異なることを行う必要がありますか?他に気をつけなければならないことはありますか?

編集-コード

を使用して各タブを設定しています

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

これはイメージアダプタクラスです

@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;
}

getItem()およびgetItemId()機能は重要ですか?ディレクトリとファイル名はすべて有効です。

4

1 に答える 1

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. getItem を埋めました。100% 必要というわけではありませんが、常に持っている方がよいでしょう。アダプタ コードの残りの部分は、それに依存することができます。
  2. 項目 ID はエントリごとに異なる必要があります。getItem(position).hashCode() を使用するか (遅くなる可能性があります)、位置を返すだけです (ここで行いました)。
  3. getView メソッドはもう少しトリッキーです。convertView が null の場合は、それを作成するという考え方です。そして、どの場合でも、ビューのコンテンツを設定します。
  4. getView アイテムの inflate は、親を親として使用する必要があり、「false」は、新しいビューを親に追加しないようにシステムに指示するためにあります (gridview が処理します)。そうしないと、一部のレイアウト パラメータが無視される可能性があります。

エラーが発生したのは、ビューがリサイクルされており (convertView が null ではない)、それらのコンテンツを設定していなかったためです。それが役立つことを願っています!

于 2011-07-04T07:57:35.820 に答える