【问题标题】:Image in listview via database+assets通过数据库+资产在列表视图中的图像
【发布时间】:2012-12-08 16:39:44
【问题描述】:

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

【问题讨论】:

    标签: android image listview assets


    【解决方案1】:

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

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

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

    【讨论】:

    • 我也试过这个,但我收到消息“方法 getContext() 未定义”
    • 上下文 MyContext;并且 MyContext.getAssets() 会亮起绿灯 :) 去检查代码会起作用。
    • 代码本身现在不工作。有一些功课要做,当它工作时会回来。阅读日志,它停在 MyContext.getAssets 行:(
    • 好的,解决了我的问题。代码本身是“好的”。我已经将上下文从上层类发送到扩展的 BaseAdapter 类并放入 MyContext 变量中。现在可以了。
    【解决方案2】:

    您将无法访问 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() 的对象的引用。如果您需要此示例,请发表评论。

    【讨论】:

    • 我认为您的代码也可以工作,但我只是选择不将所有代码放在扩展的 Activity 类中以清理内容并使我的代码可读。不确定这是否是最好的方法...
    • 无论哪种方式都适合你@Gaston,听起来你已经选择了我根据你上面所说的内容提出的第二个建议,将上下文对象传递进去并将其存储为 myContext。这种方式也同样有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多