Android Picasso如何用旧的消除图像删除缓存

时间:2015-12-15 16:02:18

标签: android image listview picasso

在我的应用中,我有ListView来管理用户的输入。 用户可以输入文本图像。 我有两个与ListView

交互的听众

LongClickListener

listView.setAdapter(adapter);

//LongClickListener for delete row in listview and row in a mysqlite
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
    @Override
    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
        // TODO Auto-generated method stub
        ImageView image_to_zoom = (ImageView) view.findViewById(R.id.compiti_imageView);

        if (image_to_zoom.getDrawable() != null) {
            //Image IN
            //Path dell'immagine da cancellare eliminando inizio file:
            String path = image_to_zoom.getTag().toString().substring(5);

            File file = new File(path);
            boolean deleted = file.delete();

            if(deleted) {
                db.deleteSelectedEvento_image(activity_name, path);
                Toast.makeText(getApplicationContext(), "Foto eliminata!", Toast.LENGTH_LONG).show();
            }else{
                Toast.makeText(getApplicationContext(), "Errore eliminazione foto", Toast.LENGTH_LONG).show();
            }
        } else {

            //Imane none, cancello il record con il testo
            //Reperisco il testo toccato e lo elimino
            TextView compito = (TextView)view.findViewById(R.id.compiti_text);
            String text_compito = compito.getText().toString();

            db.deleteSelectedEvento_text(activity_name, text_compito);
            Toast.makeText(getApplicationContext(), "Testo eliminato!" , Toast.LENGTH_LONG).show();
        }

        //Lista con il nuovo elemento
        List<Compiti> newcompito = db.CompitiPerData(activity_name);

        if(newcompito != null) {
            //Aggiorno la Listview dell'activity con il nuovo inserimento
            compiti.clear();
            compiti.addAll(newcompito);
            adapter.notifyDataSetChanged();
        }

        return true;
    }
});

处理ListView中项目的取消。 和一个普通的ClickListener

// ListView Item Click Listener
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

        ImageView image_to_zoom = (ImageView) view.findViewById(R.id.compiti_imageView);

        if (image_to_zoom.getDrawable() != null) {

            //Image IN
            String path = image_to_zoom.getTag().toString();
            openImageReader(path);

        } else {
            //Imane none
            Toast.makeText(getApplicationContext(), "Nessuna foto da visualizzare!" , Toast.LENGTH_LONG).show();

        }
    }
});

如果在行中有一个在ImageView中加载Picasso的图像,应用程序将打开图库查看器。 当我使用 longpress 删除图像时会出现此问题。 在SQLite的记录中也删除了内存中的文件,但由于存储图像的缓存,图像的缩略图仍保留在ListView 中。 我需要类似

的内容
Picasso.with(getApplicationContext()).invalidate(image_path);

但我的毕加索版本是2.5.2并且无效方法不存在。

如果我删除了图像文件,为什么列表视图中有缩略图?

这是在ImageView中加载图像的适配器

@Override
public View getView(int position, View convertView, ViewGroup parent){
    LayoutInflater inflater = (LayoutInflater) getContext()
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    convertView = inflater.inflate(R.layout.evento_list_view_line, null);

    //TODO gestire le immagini delle foto
    ImageView img = (ImageView)convertView.findViewById(R.id.compiti_imageView);
    TextView compito = (TextView)convertView.findViewById(R.id.compiti_text);

    Compiti m = getItem(position);

    if(m.getTestoCompito() != null){

        compito.setText(m.getTestoCompito());
        //Invisibile e non presente nel layout
        img.setVisibility(View.GONE);

    } else if (m.getPathFoto() != null){
        //Carico la foto nell'imageView
        Picasso.with(getContext())
                .load(m.getPathFoto())
                .resize(200, 200)
                .centerCrop()
                .into(img);
        //Setto un tag all'imageView per ritrovarla nella funzione di zoom
        img.setTag(m.getPathFoto());
    }
    return convertView;
}

我为代码中的一些意大利语评论道歉!

1 个答案:

答案 0 :(得分:0)

我认为毕加索在删除之前是指之前使用的缓存图像。

尝试清除特定图像的毕加索缓存。

最近的毕加索版本不支持invalidate()方法。

Picasso.with(上下文).invalidate(的ImagePath);