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