0

私は動物の名前を持つデータベースを持っており、他の列には動物の音があります。リストビューは正常に機能します。次に、アセットからの画像でリストビューを拡張したいと思います。このために、アセットデータを取得して使用する方法について読みました。私が試した例は私にとってうまくいきました。ここで、拡張BaseAdapterクラスにこの「アセット」コードが必要です(少なくともこれが必要だと思います)。残念ながら、BaseAdapterでgetAssets()を使用できないため、何か問題が発生しています。

問題はtry-catchブロックから始まります:「getAssets」が認識されません

これをどのように解決すると思いますか?このアセットコードを拡張された「アクティビティ」で実行できる別のクラスを作成しますか?または、リストビューのデータベース情報を介して画像を表示するためのより良い方法はありますか?

Android / Javaに慣れるために、私の探求をサポートしていただきありがとうございます。

public View getView(int position, View convertView, ViewGroup parent) {
    // get view reference
    View view = convertView;
    // if null 
    if(view == null) {
        // inflate new layout
        view = mInflater.inflate(R.layout.layout_list_item, null);
        // create a holder
        ViewHolder holder = new ViewHolder();
        // find controls
        holder.txtName = (TextView)view.findViewById(R.id.txtName);
        holder.txtPicture = (ImageView)view.findViewById(R.id.txtPicture);
        // set data structure to view
        view.setTag(holder);
    }

    // get selected user info
    UserInfo userInfo = mListUserInfo.get(position);
    // if not null
    if(userInfo != null) {
        // query data structure
        ViewHolder holder = (ViewHolder)view.getTag();
        // set data to display
        holder.txtName.setText(userInfo.getName() + ", " + userInfo.getPicture() );

        try {
                        // get input stream
                        InputStream ips = getAssets().open( userInfo.getPicture() + ".jpg");
                        Log.d("Imageloading", "Reading: " + ips);
                        // load image as Drawable
                        Drawable d = Drawable.createFromStream(ips, null);
                        // set image to ImageView

                        holder.txtPicture.setImageDrawable( d );
                    }
                    catch(IOException ex) {
                        Log.e("Imageloading", "Could not load '" + ex.getMessage()+ "'!");
                    }
    }       

    // return view
    return view;
}

コードを編集しました。getAssets()を解決するために、私は次のことを行いました。

holder.txtPicture.setImageDrawable(getSomePicture(null、userInfo.getPicture()+ ".jpg"));

public Drawable getSomePicture(Context myContext, String WhichPicture) throws IOException {
 // get input stream
    InputStream ips = myContext.getAssets().open( WhichPicture );
    Log.d("Imageloading", "Reading: " + ips);
    // load image as Drawable
    Drawable d = Drawable.createFromStream(ips, null);
return d;    
}

これはまだ解決策ではなく、もう少し調査しています...遅延読み込みの興味深いソースを見つけました

4

2 に答える 2

0

getAssets()メソッドは、Context(およびそのサブクラスであるActivity)のみが持つメソッドであるため、アクセスできません。ここで最も簡単なのは、BaseAdapterサブクラスを、それが使用されるアクティビティのプライベート内部クラスにすることです。そうすれば、getAssets()メソッドにアクセスできます。

これは次のようになります。

public class YourExampleActivity extends Activity {
@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_layout);

    }

    private class YourListAdapter extends BaseAdapter {
        @Override
       public View getView(int position, View convertView, ViewGroup parent) {
            // get view reference
            View view = convertView;
            // if null 
            if(view == null) {
                // inflate new layout
                view = mInflater.inflate(R.layout.layout_list_item, null);
                // create a holder
                ViewHolder holder = new ViewHolder();
                // find controls
                holder.txtName = (TextView)view.findViewById(R.id.txtName);
                holder.txtPicture = (ImageView)view.findViewById(R.id.txtPicture);
                // set data structure to view
                view.setTag(holder);
            }

            // get selected user info
            UserInfo userInfo = mListUserInfo.get(position);
            // if not null
            if(userInfo != null) {
                // query data structure
                ViewHolder holder = (ViewHolder)view.getTag();
                // set data to display
                holder.txtName.setText(userInfo.getName() + ", " + userInfo.getPicture() );

                try {
                    // get input stream
                    InputStream ips = getAssets().open( userInfo.getPicture() + ".jpg");
                    Log.d("Imageloading", "Reading: " + ips);
                    // load image as Drawable
                    Drawable d = Drawable.createFromStream(ips, null);
                    // set image to ImageView

                    holder.txtPicture.setImageDrawable( d );
                }
                catch(IOException ex) {
                    Log.e("Imageloading", "Could not load '" + ex.getMessage()+ "'!");
                }
            }       

            // return view
            return view;
        } 

       // Override other key methods of BaseAdapter here
    }    
}

または、BaseAdapterサブクラスがインスタンス化されたときにコンストラクターでContextオブジェクトを取り込んで、getAssets()を呼び出すためのオブジェクトへの参照を保持することもできます。この例が必要な場合は、コメントを投稿してください。

于 2012-12-09T15:58:06.237 に答える
0

非アクティビティクラスでgetAssets()関数を呼び出すには、Contextへの参照が必要です。更新されたコードで、関数'getSomePicture()'を呼び出し、myContextパラメーターにnullを渡しました。つまり、メソッドコードの後半にmyContext.getAssets()があるため、コードは失敗します。

getViewメソッドでこれを実行してみてください。

Context context = getContext();

holder.txtPicture.setImageDrawable( getSomePicture(context, userInfo.getPicture() + ".jpg") );
于 2012-12-09T15:59:38.923 に答える