这看起来很奇怪,可能是我遗失的东西请帮助我。 我在listview中的listitem中有一个图像,我试图设置位图,但它不起作用。 我在设置位图的代码:
MainActivity activity = (MainActivity) context;
// FragmentManager fmanager = activity.getFragmentManager();
ListFragment fragment = activity.getCurrentFragment();
Adapter adapter = fragment.getListView().getAdapter();
int counter = 0;
for (String key: logoAndCorrespondingPosition.keySet()){
View x = adapter.getView(logoAndCorrespondingPosition.get(key), null, null);
//logoAndCorrespondingPosition.
ImageView xx = (ImageView) x.findViewWithTag(key);
TextView xy = (TextView) x.findViewById(R.id.listitem_brand_with_offers_brandName);
if (xy!=null)
xy.setText("asdasdsdas");
byte[] logoBytes = response.ResponseResult1.get(counter);
if (logoBytes!=null){
Bitmap bitmap = BitmapFactory.decodeByteArray(logoBytes, 0, logoBytes.length);
//xx.setImageResource(R.color.transparent);
xx.setImageBitmap(bitmap);
}
counter++;
}
是的,我填充后会访问此列表视图,因为我正在使用位图值填充空白图像。 有趣的是,在调试时,没有任何视图(图像和文本,上面的代码)返回null,它们有一个与之关联的值,尽管settext和setimagebitmap从不起作用。
任何帮助非常感谢
答案 0 :(得分:0)
在适配器外部填充图像是个坏主意。了解适配器的工作原理非常重要。当您调用适配器的getView()方法时,适配器绑定现有视图(或创建新视图)以在屏幕上显示。如果您尝试调用方法getView()作为位置(未在屏幕上显示),则适配器将返回屏幕上的第一个视图。 (如果你正确使用convertView)。这就是为什么你只能为现在在屏幕上的项目设置外部适配器的位图。有些技术可以做你想做的事:
在getView()中获取图像。在这种情况下,您必须在滚动时控制您的图像视图仍然在屏幕上而不是重复使用。这是因为,在您加载数据时,用户可以滚动并重复使用此列表项。您的imageView仍然存在,但位于另一个位置。为了防止这种情况,您可以在bindView中使用position来设置图像视图的标签()。并在post执行您的imageView检查标记与您的值。对于exaple:
View bindView(final View v, int position) {
final String url = "url to bitmap";
ImageView iv = <get image view>;
iv.setTag(url);
new AsyncTask<Void, Void, Bitmap> {
Bitmap doInBackground(Void... void) {
Bitmap bitmap = <load your bitmap>;
return bitmap;
}
void onPostExecute(Bitmap bitmap) {
if (iv.getTag().equals(url))
iv.setImageBitmap(bitmap);
}
}
return view;
}
注意,我在这里编写了这段代码,它是伪代码以显示想法。
第二种方法是使用像Picasso这样的库。这一切都将为您服务。