皮卡索和适配器与视图持有者(ViewHolder)

3

我在使用Picasso时遇到了问题。我无法从Target类中访问viewHolder,并且在保存已下载的图片时出现问题。请问有人可以帮帮我吗?拜托了。

这是适配器的代码:

   public AsanasAdapter(List<Asana> asanaList, Context mContext){

        this.mContext = mContext;
        this.asanaList = asanaList;
        this.layoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }



    @Override
    public int getCount() {
        return asanaList.size();
    }

    @Override
    public Asana getItem(int position) {
        return asanaList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {

         ViewHolder viewHolder =null;


        if(convertView==null){

            viewHolder = new ViewHolder();
            convertView = layoutInflater.inflate(R.layout.asanas_item, null);
            viewHolder.asanaName = (TextView) convertView.findViewById(R.id.asana_name);
            viewHolder.asanaDesc = (TextView) convertView.findViewById(R.id.asana_desc);
            viewHolder.asanaImg = (ImageView) convertView.findViewById(R.id.asana_img);
            convertView.setTag(viewHolder);

        }
        else
        {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        String name = getItem(position).getName();
        String desc = getItem(position).getDescShort();

        viewHolder.asanaDesc.setText(desc);
        viewHolder.asanaName.setText(name);

        final File imgFile = new File(Environment.getDataDirectory()+"/"+getItem(position).getId()+".png");

        if(imgFile.exists()){

            Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());

            viewHolder.asanaImg.setImageBitmap(myBitmap);

        }
        else if (isNetworkConnected()) {

            Log.d("MYLOGGGGGGGG", MYurl.BASE_URL + "/" + getItem(position).getImgThumb() + "");
            final ViewHolder finalViewHolder = viewHolder;
            Picasso.with(mContext)
                    .load(MYurl.BASE_URL + "/" + getItem(position).getImgThumb())
                    .into(new Target() {
                        @Override
                        public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
                            viewHolder
                            File fPath = Environment.getDataDirectory();
                            File file = new File(fPath, getItem(position)+".png");
                            if (!file.exists()) {
                                try {
                                    file.mkdirs();
                                    file.createNewFile();
                                } catch (IOException e) {
                                    e.printStackTrace();
                                }
                            }

                            FileOutputStream out = null;
                            try{
                                out = new FileOutputStream(file);
                                bitmap.compress(Bitmap.CompressFormat.PNG,100,out);
                            }
                            catch (Exception e){
                                e.printStackTrace();
                            }
                            finally {
                                try{
                                    if (out != null){
                                        out.close();
                                    }
                                }
                                catch (IOException e){
                                    e.printStackTrace();
                                }
                            }
                        }

                        @Override
                        public void onBitmapFailed(Drawable errorDrawable) {

                        }

                        @Override
                        public void onPrepareLoad(Drawable placeHolderDrawable) {

                        }
                    });

        }
        else{
         //   viewHolder.asanaImg.setImageBitmap();


        }


        return convertView;
    }



    public boolean isNetworkConnected() {
        ConnectivityManager cm = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo ni = cm.getActiveNetworkInfo();
        if (ni == null) {
            // There are no active networks.
            return false;
        } else
            return true;
    }

    static class ViewHolder {
        ImageView asanaImg;
        TextView asanaName;
        TextView asanaDesc;


    }



}
2个回答

4

在这里创建一个实现 Target 接口的新类,例如:

public class MyTarget implements Target {
ViewHolder holder;
public MyTarget(ViewHolder holder){
    this.holder = holder;
}

@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {

}

@Override
public void onBitmapFailed(Drawable errorDrawable) {

}

@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {

}

并在您的代码中像这样使用它:

}

 MyTarget target = new MyTarget(viewHolder) {
        @Override
        public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
            //Use ViewHolder here
            File fPath = Environment.getDataDirectory();
            File file = new File(fPath, getItem(position)+".png");
            if (!file.exists()) {
                try {
                    file.mkdirs();
                    file.createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            FileOutputStream out = null;
            try{
                out = new FileOutputStream(file);
                bitmap.compress(Bitmap.CompressFormat.PNG,100,out);
            }
            catch (Exception e){
                e.printStackTrace();
            }
            finally {
                try{
                    if (out != null){
                        out.close();
                    }
                }
                catch (IOException e){
                    e.printStackTrace();
                }
            }
        }
    };
    Picasso.with(mContext)
            .load(MYurl.BASE_URL + "/" + getItem(position).getImgThumb())
            .into(target);

你能帮我解决这个与Picasso相关的问题吗? http://stackoverflow.com/questions/32811785/concept-of-grid-list-view-how-to-send-image-to-imageitem-class - Moudiz

1
由于Target类是一个内部类,因此无法在其中使用ViewHolder。为了访问ViewHolder,您可能需要将ViewHolder变量设置为final变量。希望这可以帮助您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接