【问题标题】:Palette in ListView Android with Picasso带有毕加索的 ListView Android 中的调色板
【发布时间】:2014-07-08 02:39:07
【问题描述】:

我有一个ListView,我正在使用支持库中的Palette。当使用 BitmapFactory.decodeStream 从 url 生成位图时,这会引发异常(UI 线程上的网络)或可能非常昂贵。我如何使这个异步?我想不出任何有效的方法来做到这一点。最好的方法是什么?

    @Override
    public View getView(int position, View convertView, ViewGroup viewGroup) {
        final ViewHolder holder;
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.item_grid, null);
            holder = new ViewHolder();
            holder.image = (ImageView) convertView.findViewById(R.id.img_photo);
            holder.bg = (LinearLayout) convertView.findViewById(R.id.bg_title);
            holder.text = (TextView) convertView.findViewById(R.id.txt_title);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        Picasso.with(mContext)
                .load(mShows.get(position).poster)
                .into(holder.image);

        try {
            URL url = new URL(mShows.get(position).poster);
            Bitmap bitmap = BitmapFactory.decodeStream(
                    url.openConnection().getInputStream()); // Too expensive!!!
            Palette palette = Palette.generate(bitmap);

            holder.text.setText(mShows.get(position).title);
            holder.text.setTextColor(palette.getVibrantColor().getRgb());

            holder.bg.setAlpha(0.4f);
            holder.bg.setBackgroundColor(palette.getDarkMutedColor().getRgb());

        } catch (IOException e) {
            e.printStackTrace();
        }

        return convertView;
    }

【问题讨论】:

    标签: android listview picasso palette


    【解决方案1】:

    您可以使用 Picasso 的 into(...)Callback 参数来判断图像何时加载成功:

    Picasso.with(mContext)
                .load(mShows.get(position).poster)
                .into(holder.image, new Callback() {
    
        @Override public void onSuccess() {
            Bitmap bitmap = ((BitmapDrawable)holder.image.getDrawable()).getBitmap();
            // do your processing here....
        }
    
        @Override public void onError() {
            // reset your views to default colors, etc.
        }
    
    });
    

    【讨论】:

      【解决方案2】:

      尝试在工作线程中进行网络和位图解码工作,并在获得位图时异步通知回来,并且您还需要位图缓存以避免重复解码工作。 一个简单的实现是这样的:

      Interface IBitmapCache {
          Bitmap get(String key);
          put(String key, Bitmap map);
      }
      
      Class YourAdapter {
      
          Class ViewHolder {
              //your other views
              //use url as key.
              String url;
          }
      
          IBitmapCache mCache;
      
          //you need to hold an instance of your listview here.
          WeakReference<ListView> mAttachedListView;
      
          View getView() {
              //... handle other things
              Bitmap bitmap = mCache.get(url);
              if (bitmap == null) {
                  //retrieve bitmap asynchronous
              }
          }
      
          //callback when bitmap is retrieved
          void onBitmapRetrived(String url, Bitmap bitmap) {
              if (mAttachedListView.get() != null) {
                  final ListView list = mAttachedListView.get();
                  final int count = list.getLastVisiblePosition() - list.getFirstVisiblePosition + 1;
                  for (int i = 0; i < count; i++) {
                      View v = lv.getChildAt(i);
                      if (v == null) {
                          continue;
                      }
                      ViewHolder holder = (ViewHolder) v.getTag();
                      if (url.equals(holder.url)) {
                          //do your Palette related things here.
                          break;
                      }
                  }
              }
          }
      }
      

      还有两件事你应该做,把你解码的位图放到你的位图缓存中,设置一个回调到你的工作线程并确保它在 UI 线程上被调用,这可以通过Handler 轻松实现。

      【讨论】:

        猜你喜欢
        • 2015-07-25
        • 2017-05-17
        • 2019-02-16
        • 1970-01-01
        • 2023-03-25
        • 2016-07-17
        • 2017-06-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多