列表视图中的listitem内的ImageView的任何操作都不起作用 - Android

时间:2014-06-30 06:30:17

标签: android listview

这看起来很奇怪,可能是我遗失的东西请帮助我。 我在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从不起作用。

任何帮助非常感谢

1 个答案:

答案 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这样的库。这一切都将为您服务。