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 子类成为要使用它的 Activity 的私有内部类。这样,您就可以访问 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()”并将 null 传递给 myContext 参数。这意味着您的代码将失败,因为您的方法代码中有 myContext.getAssets() 。

尝试在您的 getView 方法中执行此操作:

Context context = getContext();

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