listview中的图像通过数据库+资产

时间:2012-12-08 16:39:45

标签: android image listview assets

我有一个动物名称的数据库,另一列有动物的声音。 列表视图工作正常,现在我想用资产中的图像扩展它。 为此我已经阅读了有关如何获取资产数据并使用它的信息。 我试过的一个例子对我来说很好。 现在我想在扩展的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;    
}

这仍然不是解决方案,研究更多...... 找到Lazy Loading

的有趣来源

2 个答案:

答案 0 :(得分: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()的引用的引用。如果您需要一个例子,请发表评论。

答案 1 :(得分:0)

要在非活动类中调用getAssets()函数,您需要引用Context。在更新的代码中,您调用了函数'getSomePicture()'并将null传递给myContext参数。这意味着您的代码将失败,因为您的方法代码稍后会有myContext.getAssets()。

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

Context context = getContext();

holder.txtPicture.setImageDrawable( getSomePicture(context, userInfo.getPicture() + ".jpg") );