Java 某些图像未在ImageView中显示

Java 某些图像未在ImageView中显示,java,android,listview,android-studio,Java,Android,Listview,Android Studio,我创建了一个短信应用程序,我想显示联系人的照片,我通过以下方式获得了输入流: public InputStream openPhoto(long contactId) { Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contactId); Uri photoUri = Uri.withAppendedPath(contactUri, ContactsContr

我创建了一个短信应用程序,我想显示联系人的照片,我通过以下方式获得了输入流:

public InputStream openPhoto(long contactId) {
    Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contactId);
    Uri photoUri = Uri.withAppendedPath(contactUri, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
    Cursor cursor = getContentResolver().query(photoUri, new String[]{ContactsContract.Contacts.Photo.PHOTO}, null, null, null);
    if (cursor == null) {
        return null;
    }
    try {
        if (cursor.moveToFirst()) {
            byte[] data = cursor.getBlob(0);
            if (data != null) {
                return new ByteArrayInputStream(data);
            }
        }
    } finally {
        cursor.close();
    }
    return null;
}
然后我显示如下:

Bitmap bmp = BitmapFactory.decodeStream(listMessage.get(position).photo);
imageContact.setImageBitmap(bmp);
下面是发生的情况:

首先,当我运行我的应用程序时,当我向下滚动时,会显示一些图像,但当我向上滚动到顶部,然后返回到末尾时,图像会消失

正如你所看到的,我的列表中没有第一张图片,只有最后一张 所以我的第一个问题是,为什么我的联系人“Nico Aragon”和“Elouudie”的第一张照片没有显示出来? 第二个问题,为什么当我的listView“刷新”最后一个图像时会消失/

这是我的自定义listView适配器

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:descendantFocusability="blocksDescendants"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#000"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="Medium Text"
        android:id="@+id/tvContact"
        android:layout_gravity="center_horizontal"
        android:layout_alignTop="@+id/im_photoContact"
        android:layout_alignLeft="@+id/lastSms"
        android:layout_alignStart="@+id/lastSms" />

    <ImageView
        android:contentDescription="@string/photoContact"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/im_photoContact"
        android:minWidth="50dp"
        android:minHeight="50dp"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="10dp"
        android:layout_marginBottom="10dp"
        android:maxHeight="50dp"
        android:maxWidth="50dp" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Large Text"
        android:id="@+id/lastSms"
        android:ellipsize="end"
        android:maxWidth="300dp"
        android:maxLines="1"
        android:singleLine="true"
        android:textColor="#c4c4c4"
        android:textSize="15dp"
        android:layout_alignBottom="@+id/im_photoContact"
        android:layout_toRightOf="@+id/im_photoContact"
        android:layout_toEndOf="@+id/im_photoContact"
        android:layout_marginLeft="10dp" />

    <ImageView
        android:layout_width="10dp"
        android:layout_height="10dp"
        android:background="@drawable/new_message"
        android:id="@+id/im_new_message"
        android:layout_marginRight="10dp"
        android:layout_marginTop="25dp"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />

</RelativeLayout>
设置适配器的位置:

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

final String packageName = MainActivity.this.getPackageName();
if (!Telephony.Sms.getDefaultSmsPackage(MainActivity.this).equals(packageName)) {
    Intent intent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);
    intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, packageName);
    startActivity(intent);
}

toolbar = (Toolbar) findViewById(R.id.toolbar);
ListView lv = (ListView) findViewById(R.id.ListView01);

setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false); //enlever le titre originel
getSupportActionBar().setHomeButtonEnabled(true); // ajout du bouton retour
getSupportActionBar().setDisplayHomeAsUpEnabled(true); // ajout du bouton retour

listContact = new ArrayList<>();
idList = new ArrayList<>();

getInfoMain();
lv.setAdapter(adapter);

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        String persoId = listContact.get(position).id;
        String numero = listContact.get(position).address;
        String contact = listContact.get(position).contact;
        String body = listContact.get(position).body;
        Intent intent = new Intent(MainActivity.this, PrintMessage.class);
        intent.putExtra("id", persoId);
        intent.putExtra("numero", numero);
        intent.putExtra("contact", contact);
        markMessageRead(ctx, numero, body);
        startActivity(intent);
    }
});
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
最后一个字符串packageName=MainActivity.this.getPackageName();
如果(!Telephony.Sms.getDefaultSmsPackage(MainActivity.this).equals(packageName)){
意向意向=新意向(Telephony.Sms.Intents.ACTION\u CHANGE\u DEFAULT);
intent.putExtra(Telephony.Sms.Intents.EXTRA\u包名称,packageName);
星触觉(意向);
}
toolbar=(toolbar)findviewbyd(R.id.toolbar);
ListView lv=(ListView)findViewById(R.id.ListView01);
设置支持操作栏(工具栏);
getSupportActionBar().setDisplayShowTitleEnabled(false);//初始标题
getSupportActionBar().setHomeButtonEnabled(true);//布顿街
getSupportActionBar().setDisplayHomeAsUpEnabled(true);//一个关于bouton retour的文件
listContact=新的ArrayList();
idList=newarraylist();
getInfoMain();
低压设置适配器(适配器);
lv.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
String persoId=listContact.get(position.id);
字符串numero=listContact.get(position).address;
String contact=listContact.get(position.contact);
字符串体=listContact.get(position).body;
意向意向=新意向(MainActivity.this、PrintMessage.class);
意图。putExtra(“id”,persoId);
意向。额外(“数字”,数字);
意向。额外(“联系”,联系);
markMessageRead(ctx、数字、正文);
星触觉(意向);
}
});
}

listMessage.get(position).photo=contain 这是openPhoto的结果,这是一个inputStream,将ContactAdapter.java的getView()替换为以下代码:

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

    RecordHolder holder = null;

    if (convertView == null) {

        LayoutInflater inflater = ((Activity) context).getLayoutInflater();
        convertView = inflater.inflate(R.layout.contact_items, parent, false);
        holder = new RecordHolder();

    holder.tvContact = (TextView) layoutItem.findViewById(R.id.tvContact);
    holder.lastSms = (TextView) layoutItem.findViewById(R.id.lastSms);
    holder.imageContact = (ImageView) layoutItem.findViewById(R.id.im_photoContact);
    holder.newMsg = (ImageView) layoutItem.findViewById(R.id.im_new_message);

        convertView.setTag(holder);
    } else {
        holder = (RecordHolder) convertView.getTag();
    }


    if (listMessage.get(position).photo != null) {
        Bitmap bmp = BitmapFactory.decodeStream(listMessage.get(position).photo);
        holder.imageContact.setImageBitmap(bmp);
    } else {
        holder.imageContact.img.setImageResource(R.drawable.contacticon);
    }
    if (!listMessage.get(position).contact.equals("no"))
        tvContact.setText(listMessage.get(position).contact);
    else
        holder.tvContact.setText(listMessage.get(position).address);
    if (listMessage.get(position).read == 0) {
        holder.newMsg.setBackgroundResource(R.drawable.new_message);
    } else
        holder.newMsg.setBackgroundResource(0);
    holder.lastSms.setText(listMessage.get(position).body);
    //On retourne l'item créé.
    return convertView;
}
在getView()外部创建记录持有者

static class RecordHolder {
    TextView tvContact, lastSms;
    ImageView imageContact , newMsg;
}

好吧,好吧,我解决了我的问题。 我的方法openPhoto(取自android的官方文档)返回一个InputStream,我将其更改了一个字节[]。然后我打印它:

    Bitmap bmp = BitmapFactory.decodeByteArray(listMessage.get(position).photo, 0, listMessage.get(position).photo.length);;
    holder.imageContact.setImageBitmap(bmp);
但我不知道为什么它会起作用。。如果有人能解释我


谢谢:)

您能在这里包含ListView适配器的代码吗?我更新了它。对不起,这是第三个代码。我不想在这里使用xml代码。我想要ListView适配器的java代码。哦,对不起,我想现在没问题了。你的问题中包含了很多细节,但这完全让人困惑。你从哪里得到了
mContext
?我想这是活动的背景,但我不明白:/。我不能做类似于
Context ctx=this
将其重命名为Context的事情,因为您在ContactAdapter.java的构造函数中得到了它。太愚蠢了,对不起。。但总是一样的://。调试时,我得到了图像的输入流,当我到达
if(listMessage.get(position).photo!=null){Bitmap bmp=BitmapFactory.decodeStream(listMessage.get(position).photo);imageContact.setImageBitmap(bmp);}否则{imageContact.setImageBitmap(null);}
我进入“if”中我用InputStream设置了图像,但没有显示它:/studpid是什么?我的问题是“你从哪里获得McContext?”
            @Override
public View getView(int position, View convertView, ViewGroup parent) {

    RecordHolder holder = null;

    if (convertView == null) {

        LayoutInflater inflater = ((Activity) context).getLayoutInflater();
        convertView = inflater.inflate(R.layout.contact_items, parent, false);
        holder = new RecordHolder();

    holder.tvContact = (TextView) layoutItem.findViewById(R.id.tvContact);
    holder.lastSms = (TextView) layoutItem.findViewById(R.id.lastSms);
    holder.imageContact = (ImageView) layoutItem.findViewById(R.id.im_photoContact);
    holder.newMsg = (ImageView) layoutItem.findViewById(R.id.im_new_message);

        convertView.setTag(holder);
    } else {
        holder = (RecordHolder) convertView.getTag();
    }


    if (listMessage.get(position).photo != null) {
        Bitmap bmp = BitmapFactory.decodeStream(listMessage.get(position).photo);
        holder.imageContact.setImageBitmap(bmp);
    } else {
        holder.imageContact.img.setImageResource(R.drawable.contacticon);
    }
    if (!listMessage.get(position).contact.equals("no"))
        tvContact.setText(listMessage.get(position).contact);
    else
        holder.tvContact.setText(listMessage.get(position).address);
    if (listMessage.get(position).read == 0) {
        holder.newMsg.setBackgroundResource(R.drawable.new_message);
    } else
        holder.newMsg.setBackgroundResource(0);
    holder.lastSms.setText(listMessage.get(position).body);
    //On retourne l'item créé.
    return convertView;
}
static class RecordHolder {
    TextView tvContact, lastSms;
    ImageView imageContact , newMsg;
}
    Bitmap bmp = BitmapFactory.decodeByteArray(listMessage.get(position).photo, 0, listMessage.get(position).photo.length);;
    holder.imageContact.setImageBitmap(bmp);