【问题标题】:doInBackground (Agenda. .. params) does not return bitmap image in listViewdoInBackground (Agenda. .. params) 不在 listView 中返回位图图像
【发布时间】:2014-03-17 19:35:30
【问题描述】:

我 3 天前现在正在寻找答案,但没有找到满意的答案。 我创建了一个列表视图来用图片和文本填充它,图像保存在 sqlite 数据库中的方式和图像在手机的 sd 卡中,但不是数据库中的所有行都有图像路径,所以我我放置了一个默认图像,但问题是即使是路径的图像,也不会返回到这个图像,遵循我的适配器代码如下:

public class AgendaListAdapter extends ArrayAdapter<Agenda> {

private LayoutInflater inflater;
private List<Agenda> lista;
private Agenda agenda;
int resources;

//constructor
public AgendaListAdapter(Context context, int resource, List<Agenda> lista){
    super(context, resource, lista);

    this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    this.resources = resource;
    this.lista = lista;
}

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

@Override
public Agenda getItem(int position) {
    return lista.get(position);
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    agenda = lista.get(position);
    //cria uma referencia para viewHolder
    //creates a reference to
    ViewHolder viewHolder;

    //verifica se a view esta sendo reusada ou não
    //verifies that the view is being reused or not
    if(convertView == null){
        viewHolder = new ViewHolder();

        convertView = inflater.inflate(R.layout.linha_listar_telefones, null);
        viewHolder.mNome = (TextView) convertView.findViewById(R.id.nome);
        viewHolder.mImagem = (ImageView) convertView.findViewById(R.id.listar_contato_imagem);
        convertView.setTag(viewHolder);
    }else{

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



    if(agenda != null){
        if(viewHolder.mNome != null){
            viewHolder.mNome.setText(agenda.nome);              
        }

        if(viewHolder.mImagem != null){
            viewHolder.mImagem.setTag(lista.get(position));
            Log.w("Livro", "Positiom: "+position);
                Log.e("Livro", "Viewhol.imagem não é nulo "+viewHolder.mImagem);
                new loadImageTask(viewHolder.mImagem).execute();
        }

    }


    return convertView;
}




private static class ViewHolder{

    protected TextView mNome;
    protected ImageView mImagem;
}
Bitmap b = null;

private class loadImageTask extends AsyncTask<Agenda, Void, Bitmap>{

    private ImageView imv;
    private String path;

    public loadImageTask(ImageView imv) {
        this.imv = imv;
        this.path = agenda.caminho_imagem;
   }



    @Override
    protected Bitmap doInBackground(Agenda... params) {

        Log.w("Livro", "path: "+path);

        File file = new File( 
                Environment.getExternalStorageDirectory().getAbsolutePath() + path);

        if(file.exists()){
            b =  BitmapFactory.decodeFile(file.getAbsolutePath());

        }

        return b;

        }

    @Override
    protected void onPostExecute(Bitmap result) {
        if(result != null && imv != null){
            Log.i("Livro", "Result do onPostExcute não é nulo: "+result);
            imv.setVisibility(View.VISIBLE);
            imv.setImageBitmap(result);
        }else{
            Log.i("Livro", "Result do onPostExcute é nulo: "+result);
            imv.setImageResource(R.drawable.foto_pessoa);
        }
    }


}

}

在返回此的 logcat 路径中:content ://media/external/images/media/16 变量文件返回以下结果:/ storage/emulated/sdcard0content ://media/external/images/media/16

我知道这个错误文件的结果,但是会转换成uri路径并将uri传递给文件吗?

谢谢大家!!!

【问题讨论】:

    标签: android android-listview android-asynctask android-imageview android-adapter


    【解决方案1】:

    路径//media/external/images/media/16是Media Uri...你必须从Uri获取实际的文件路径,然后将图像设置为ImageView。

    从Media Uri获取真实文件路径如下,返回路径为绝对文件路径...

    public String getRealPathFromURI(Context context, Uri contentUri) {
      Cursor cursor = null;
      try { 
        String[] proj = { MediaStore.Images.Media.DATA };
        cursor = context.getContentResolver().query(contentUri,  proj, null, null, null);
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
      } finally {
        if (cursor != null) {
          cursor.close();
        }
      }
    }
    

    从getRealPathFromURI()方法返回的路径中获取Bitmap如下...

    上下文 mContext;

    public loadImageTask(Context context, ImageView imv) {
    
        this.mContext = context;
    
        this.imv = imv;
        this.path = agenda.caminho_imagem;
    }
    
    @Override
    protected Bitmap doInBackground(Agenda... params) {
    
        Log.w("Livro", "path: "+path);
    
        File file = new File(getRealPathFromURI(mContext, path));
    
        if(file.exists()){
            b =  BitmapFactory.decodeFile(file.getAbsolutePath());
    
        }
    
        return b;
    }
    

    并通过 asynctask 构造函数传递活动的上下文,如下所示...

    new loadImageTask(context, viewHolder.mImagem).execute();
    

    【讨论】:

    • 您好,感谢您的帮助,图片将进入 listView,但现在出于某种原因,它们只进入第一行。
    • 通过调试找出原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多